我有一個SQL Server 2005中的大表,我必須通過非集羣密鑰選擇記錄,並且我試圖儘可能優化此過程。不一致的SQL Server執行計劃密鑰查找
表中有很多列,我在三個不同的列上添加了非聚簇索引。
SELECT * FROM table WHERE Field1 = 10;
SELECT * FROM table WHERE Field2 = 40;
SELECT * FROM table WHERE Field3 = 'A';
Field 1和字段2是整數字段,字段3是一個varchar。
當我要求從SQL Server這三個查詢的估計查詢執行計劃,我得到基本相同的計劃,每個:
SELECT -> Nested Loop -> Index Seek
-> Key Lookup
但我發現,那個執行時間有很大的不一致。具體而言,第二個查詢佔總查詢成本的98%。其執行計劃與其他計劃相同,只是與索引搜索相比,密鑰查找步驟的成本爲100%。在另外兩個查詢中,它接近50%。
我知道Key Lookup是不受歡迎的,可以通過在索引中添加列來避免這些額外的列被查找。但是,在這種情況下,我希望表中的所有列都返回給我,所以將它們全部添加到索引是沒有意義的。但是,一個索引如何導致密鑰查找操作比另一個密鑰查找花費更多的時間呢?