16

ほとんどのリレーショナルデータベースのほとんどのドライバーでは、結果にアクセスするためのデフォルトの推奨される方法は、カーソルまたはイテレーターを使用することです。

私が推測しているのは、データベースは次のようなことをしているということです。

  1. クエリを実行します。
  2. 結果を準備し、RAMに保存しますか?
  3. 結果のカーソルをクライアントに返します。

データベースドライバは、次の結果をフェッチするための呼び出しを受け取るたびに、そのカーソルをデータベースに渡します。これにより、次の結果が得られます。

しかし、それが本当に正しいかどうかはわかりません。私を困惑させるのは、データベースクライアントとデータベースサーバーが異なるノード上にあり、ネットワークを介して通信している場合、これは遅いのではないかということです。それは本当にそのような怠惰なアプローチを使用していますか?すべてのデータを返さないのは理にかなっていますが、それが取る中間パスはありますか?

4

2 に答える 2

12

カーソルは、位置を示す移動する配置またはポインタです。英語を話す人は、16世紀以来、さまざまな可動または可動の位置マーカーに対してこの意味でこの用語を使用してきました。 ウィキペディアの説明

テキストエディタでカーソルのイメージを想起させることになっています。これは、(一部のコンテキストでは)ポインター(カーソル)が特定のデータセット内にある場所のプレースホルダーです。行(つまり行)はcursor.fetchone()で返され、カーソルは次の行/行の先頭に進みます。

カーソルは、データベースクライアントで現在バッファリングされている行数を抽象化します。カーソルがバッファの終わりに近づくと、基盤となるフレームワークはより多くのコンテンツをフェッチします。デフォルトは通常、メモリ割り当て、ネットワーク遅延、およびその他の要因の間の適切なトレードオフを適切に推測します。

それは最適化の問題になります。グーグルマップは良い比較を提供します。ユーザーはパンすることができ、国全体の地図がクライアントにダウンロードされたように見えますが、実際には、必要になる直前に隣接するパネルをダウンロードしています。

データベースクライアントにこのバッファリングを実行させることで、プログラマーは最適化が必要になる前にそれについて考える必要がなくなります。

于 2011-02-18T04:30:17.863 に答える
3

データベースは、完全な結果セットを一度に送信します。カーソル/イテレータはクライアント側のドライバにあります。

于 2011-02-18T04:22:42.823 に答える