2009-05-04 7 views
17

履歴データを検索するクエリを最適化しようとしています。私は実行計画を検索するためにクエリアナライザを使用しており、クエリコストの大部分が「ブックマーク参照」と呼ばれるものにあることがわかりました。以前はこのノードを実行計画で見たことがなく、その意味を知らない。Sql Serverのブックマークルックアップとは何ですか?

これはクエリでは良いことか悪いことですか?

答えて

28

ブックマークルックアップは、クラスタ化されていないインデックスにあるエントリに基づいて、SQLテーブルの実際のデータを検索するプロセスです。

クラスタ化されていないインデックスの値を検索し、クエリにインデックスリーフノードの一部(すべてのインデックスフィールドと可能なINCLUDE列)よりも多くのフィールドが必要な場合、SQL Serverは必要です実際のデータページを取得します。これがブックマークルックアップと呼ばれています。

実際には唯一の方法です。クエリにもう1つのフィールドが必要な場合(非大量のフィールドは必要ありません)、非表示フィールドにそのフィールドをインクルードすることをお勧めします。クラスタ化インデックス。その場合、クラスター化されていない索引のリーフ・レベルのノードには、照会(「カバー」索引)を満たすのに必要なすべてのフィールドが含まれるため、ブックマークの参照はもはや必要ありません。

マルク

+2

テーブルの大部分が返された場合は、テーブルスキャンを行う方が良いかもしれませんが、統計情報が不十分な場合は、代わりにブックマークルックアップを実行する計画があります。 redgateでの実行計画についてはまったくまともな無料の電子ブックがあります - http://www.red-gate.com/specials/Grant.htm – ahains

+1

、Red Gateのサイトは、利用可能な素晴らしいSQL Serverのものがたくさんありました。無料でも! –

3

これは行ポインタ上のテーブル自体と非クラスタ化インデックスを結合NESTED LOOPです。

は、このようなクエリのために発生します。

SELECT col1 
FROM table 
WHERE col2 BETWEEN 1 AND 10 

、あなたがcol2にインデックスを持っている場合。

col2のインデックスには、インデックス付き行へのポインタが含まれています。

したがって、col1の値を取得するために、エンジンが1から10にキー値のcol2にインデックスを走査する必要があり、各インデックスリーフのために、中に含まれるポインタを使用して、表自体を参照葉、col1の値を確認します。

This articleBookmark LookupブックマークルックアップについてSQL Server 2005インデックスとテーブルとの間SとMSDNから

+0

CLUSTERED KEY LOOKUPはブックマーク検索AFAIKです。 –

+0

NESTED LOOPとして参照するのは少し混乱するかもしれませんが、実際にはNESTED LOOP結合タイプの権利に実際には関係していませんか?私はあなたが概念的に話していると思いますか? – ahains

+0

テーブル内の各レコードには、このレコードにアクセスするための物理ポインターがあります。実際、クラスタ化されていないインデックスは別のテーブルです。 SELECT * FROMテーブルのWHERE col1とbとの間には、実際には隠しジョインがあります。SELECT * FROM col1_index JOINテーブルON table.rowid = col1_index where col1_index.col1とbの間b。この結合は、NESTED LOOPおよびHASH(2つの索引が結合されている場合)でも可能です。 – Quassnoi

2

上記SQL Server 2000NESTED LOOPによって置き換えられるの用語、」のあることが指摘:

ブックマーク検索演算子は ブックマーク(行IDまたはクラスタ化キー)を使用して テーブルまたはクラスタ化インデックス の対応する行をルックアップします。引数 列には、表 またはクラスタード・インデックス内の行を検索するためにブックマーク・ラベル が使用されています。引数 の列には、 の行が参照されている テーブルまたはクラスタ化インデックスの名前も含まれています。WITH PREFETCH 句は、引数列に表示された場合は、 クエリプロセッサはテーブルまたはクラスタ化 インデックスにブックマークを を検索するとき、(先読み)非同期 プリフェッチを使用するのが最適であることを を決定しました。

関連する問題