2016-07-27 27 views
0

我已經創建了具有聚簇索引的示例表,並插入了1500條記錄。無法獲取具有主鍵的位置的ClusteredIndexSeek

CREATE CLUSTERED INDEX IX_mytable_myid ON dbo.MyTable(myid) 

當我執行下面的查詢中,我可以看到已經聚集了執行計劃,索引掃描,而不是尋求。我不知道爲什麼索引表被掃描。

SELECT myid FROM dbo.MyTable WHERE myid=1666 

enter image description here

+1

您可以使用forceseek提示強制sql server尋找索引 – bmsqldev

+0

感謝您指出提示。問題確定。 –

回答

1

道歉。我發現通過執行計劃中的警告符號,發現myid字段實際上是一個varchar,並且發生了隱式轉換,這會強制執行掃描而不是查找。

當像這樣查詢時 SELECT myid FROM dbo.MyTable WHERE myid ='1666' 它執行搜索。

+0

這不是我所期待的。如果myID列確實是varchar,那麼我希望SQL將靜態值(即1666)隱式轉換爲varchar,然後與此運行(而不是在等式的表格一側進行隱式轉換)。我懷疑爲什麼你看到掃描是你的桌子很小, 1500行可能只有幾頁,對於小型表格來說,掃描整個表格要比找出需要讀取的小頁面中的哪一個更有效。 –

+0

@BenThul我明白你的觀點。但是,當查詢爲myid ='1666'時,它確實尋找相同數量的記錄。我的理解是seek可以通過二叉樹搜索完成,如果數據類型不匹配,這將是不可預測的。因此索引掃描會發生。 –

+0

如果我的理解錯誤,請糾正我。感謝您的討論。 –