我有一個表格MY_TABLE
約900萬行。查詢性能悖論:獨特的羣集與非唯一的非羣集索引
該表共有38列。這是有關我的問題的列有:
RECORD_ID
:身份,BIGINT,具有獨特的聚集索引RECORD_CREATED
:日期時間,與非唯一&非聚集索引現在
我運行以下兩個查詢,自然期望第一個執行速度更快,因爲數據按具有唯一聚簇索引的列進行排序,但它以某種方式執行了271次(!)較慢。
SELECT TOP 1
RECORD_ID
FROM
MY_TABLE
WHERE
RECORD_CREATED >= '20140801'
ORDER BY
RECORD_ID
SELECT TOP 1
RECORD_ID
FROM
MY_TABLE
WHERE
RECORD_CREATED >= '20140801'
ORDER BY
RECORD_CREATED
執行時間分別爲1630ms和6ms。
請指教。
P.S.:由於環境的安全策略,我看不到執行計劃或使用SQL Profiler
。
第二個只是一個直接索引尋求。如果索引不覆蓋,則讀取第一行大於或等於查找點以及可能的單個查找。在你的情況下,索引將被覆蓋,因爲NCI總是包含CI密鑰,因此不需要查找。 – 2014-09-10 18:39:26
@馬丁史密斯,我真的很抱歉,但我完全不理解你的評論。你能解釋一下嗎?答案也是受歡迎的。 – 2014-09-10 19:26:28
我不會在PC上提交答案,因爲我不在PC上。通常'RECORD_CREATED> ='20140801'可以通過範圍尋找來滿足。找到索引中的相關點,然後一起掃描。因爲您只想索引順序中的前1位,SQL Server可以在讀取第一行時立即停止範圍查找。您的選擇列表實際上位於不同的列'record_id'上,但它也靜默地包含在非聚集索引中,因爲它是聚簇索引鍵。 – 2014-09-10 19:32:43