web-dev-qa-db-ja.com

カーソルの内部アーキテクチャ

カーソルがあまり良くないことは知っていますが、カーソルの内部構造についていくつか質問があります。

カーソルの最初のステップは、どのカーソルが繰り返されるかを決定することです。それで、カーソルはSELECTクエリを実行して結果を一時テーブルに入れましたか、それとも何らかの方法で実装されていますか?

SQLは、初めてデータページが必要になったときに、メモリ形式のディスクにデータページを取ります。したがって、単純なSELECTクエリを手動で実行し、SQLがメモリ内のデータページをプルするとします。また、SELECTクエリのFOR句に同じクエリがあると仮定します。カーソルを閉じて割り当てを解除すると、カーソルの終わりで何が起こりましたか?カーソルは使用済みデータページからメモリを解放しましたか、それともそのデータページはメモリに残っていますか?

2
veljasije

Concepts: Cursors に記載されているように、カーソルの種類によって異なります。

転送のみ

前方専用カーソルはスクロールをサポートしていません。カーソルの先頭から末尾まで連続して行をフェッチすることのみをサポートします。行は、フェッチされるまでデータベースから取得されません...データベースAPIカーソルモデルは、前方専用カーソルを別個のタイプのカーソルと見なしますが、SQLServerはそうではありません。 SQL Serverは、前方カーソルとスクロールカーソルの両方を、静的カーソル、キーセット駆動カーソル、および動的カーソルに適用できるオプションと見なします。

静的

静的カーソルの完全な結果セットは、カーソルが開かれたときにtempdbに組み込まれます。 .。

キーセット

キーセット駆動カーソルのメンバーシップと行の順序は、カーソルを開いたときに固定されます。キーセット駆動型カーソルは、キーセットと呼ばれる一意の識別子、キーのセットによって制御されます。キーは、結果セットの行を一意に識別する列のセットから作成されます。キーセットは、カーソルが開かれたときにSELECTステートメントの対象となったすべての行のキー値のセットです。キーセット駆動カーソルのキーセットは、カーソルが開かれたときにtempdbに組み込まれます。

動的

動的カーソルは静的カーソルの反対です。動的カーソルは、カーソルをスクロールしたときに結果セットの行に加えられたすべての変更を反映します。結果セットの行のデータ値、順序、およびメンバーシップは、フェッチごとに変更される可能性があります。 .。

メモリの使用に関しては、すべてのデータアクセスはバッファプールを経由します。 メモリマネージャアーキテクチャ を参照してください。 「クローズ」も「割り当て解除」も発生していません。データは必要に応じてメモリに取り込まれ、複数のクエリによって参照される場合があり、より多くの空きメモリが必要な場合にのみ削除されます。

4
Remus Rusanu