Sql-Server
RID Lookup 與 Key Lookup 之間的性能差異?
非聚集索引使用聚集索引的鍵定位行與該表沒有聚集索引並且非聚集索引通過 RID 定位行之間是否存在性能差異?
不同級別的碎片是否也會影響這種性能比較?(例如,在這兩種情況下,表的碎片率為 0%,vs 50%,vs 100%。)
撇開碎片問題不談(在進行單例查找時並不重要),主要區別在於 RID 指定行所在的確切頁,而使用鍵查找可以遍歷聚集索引的非葉級別找到目標頁面。Aaron Bertrand 在Is a RID Lookup faster than a Key Lookup 中對此做了一些測試?
但是,堆可以在其中轉發提取(或記錄),在這種情況下,需要多個邏輯 IO 才能找到目標行。
我最近在部落格上寫了這個,我在這裡複製內容以避免評論答案。
CREATE TABLE el_heapo ( id INT IDENTITY, date_fudge DATE, stuffing VARCHAR(3000) ); INSERT dbo.el_heapo WITH (TABLOCKX) ( date_fudge, stuffing ) SELECT DATEADD(HOUR, x.n, GETDATE()), REPLICATE('a', 1000) FROM ( SELECT TOP (1000 * 1000) ROW_NUMBER() OVER (ORDER BY @@SPID) FROM sys.messages AS m CROSS JOIN sys.messages AS m2 ) AS x (n) CREATE NONCLUSTERED INDEX ix_heapo ON dbo.el_heapo (date_fudge);
EXEC master.dbo.sp_BlitzIndex @DatabaseName = N'Crap', @SchemaName = 'dbo', @TableName = 'el_heapo';
此查詢將生成書籤查找。
SELECT * FROM dbo.el_heapo AS eh WHERE eh.date_fudge BETWEEN '2018-09-01' AND '2019-09-01' AND 1 = (SELECT 1) OPTION(MAXDOP 1);
現在我們可以導致一些轉發的記錄發生:
UPDATE eh SET eh.stuffing = REPLICATE('z', 3000) FROM dbo.el_heapo AS eh WHERE eh.date_fudge BETWEEN '2018-09-01' AND '2019-09-01' OPTION(MAXDOP 1)
BlitzIndex 將向我們展示它們:
如果我們重新執行查找查詢:
Profiler 也會顯示出不同之處: