Sql-Server

在這種情況下,什麼是好的索引?

  • November 22, 2019

我有一個非常大的臨時表(約 500 萬行),我需要更新一些欄位。

這是一個範例更新語句:

UPDATE T    
SET CarModel = 
   CASE 
       WHEN CarModel = '350z' AND ModelYear = 2008 AND CarMake NOT LIKE '%DATSUN%' THEN '370z Nismo' 
       ELSE CarModel
   END,
IsMidTierCar = 
   CASE 
       WHEN NumberOfCarsSold >= 500000 AND <= 1000000 THEN IsMidTierCar 
       ELSE NULL 
   END,
IsRareCarMakeModel = 
   CASE 
       WHEN CarModel = '350z' AND SpecialEditioName != '' AND ModelYear = 2008 THEN 1
       ELSE 0
   END
FROM #CarsTempTable AS T
WHERE IsRareCarMakeModel IS NULL

問題是在此更新執行之前,臨時表中的每一行的 IsRareCarMakeModel 欄位都為 NULL。現在我看到它執行的最快時間是當我沒有在我的臨時表上創建任何索引時。我嘗試過的任何其他索引組合的執行時間至少是 5 倍(通常我最終會殺死它而不是等待它完成。)

由於臨時表的 IsRareCarMakeModel 欄位的基數極低,因此沒有索引會是我能得到的最好的索引,因此表掃描始終是優化器的最佳行動方案?

羅納爾多的評論讓我思考,我想得越多,我會回答我自己的問題:如果表的每一行都需要讀取,那麼就沒有辦法對數據的儲存方式進行排序以改進讀取性能。換句話說,沒有索引可以使我的場景中的更新語句更快,因為需要讀取每一行才能在該查詢中更新(不管查詢是否有過濾器,因為過濾器實際上並沒有返回行數少於表中的所有內容。)

引用自:https://dba.stackexchange.com/questions/253951