我有一個表用戶與一堆索引。其中之一是AccountIdentifier列上的唯一索引。這個sql查詢爲什麼要做鍵查找?
由於這是一個唯一的索引,爲什麼除索引查找外還需要查找關鍵字?索引查找工具提示報告只返回一條記錄。我也嘗試將索引轉換爲「唯一鍵」類型。
alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png
我有一個表用戶與一堆索引。其中之一是AccountIdentifier列上的唯一索引。這個sql查詢爲什麼要做鍵查找?
由於這是一個唯一的索引,爲什麼除索引查找外還需要查找關鍵字?索引查找工具提示報告只返回一條記錄。我也嘗試將索引轉換爲「唯一鍵」類型。
alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png
因爲它是選擇*
。
它使用非聚集索引來定位行,但是需要去獲取要返回的數據。
爲了避免bookmark lookup你需要讓非聚集索引覆蓋索引(最好通過減少在選擇列表中,但可能列數也通過添加新的列到索引本身或作爲included columns)
如果表上有聚簇索引,則非聚簇索引中的行定位符將包含聚簇索引鍵,因此無需書籤查找即可滿足AccountIdentifier
和聚簇索引列上的查詢。
我做了一些試驗。所以它似乎選擇了不在索引使用結果中的任何關鍵查找。這就說得通了。 – 2010-07-03 00:29:22
@BC - 基本上是的,但如果你有一個聚集索引,你可以考慮自動包含這些列。 – 2010-07-03 00:33:32
密鑰查找並不意味着「查找密鑰」,而是「查找基於密鑰的行」。
請參閱以下文章和博客上的鍵查找/書籤查找一些背景資料:
順便說一句:永遠不要在生產系統上做SELECT * - **絕不** - 沒有例外。這是不好的做法,開始...... – 2010-07-03 07:03:37