Sql-Server
隱式轉換不影響性能
我已經閱讀過關於索引的隱式轉換會影響性能,因此在以下查詢中意味著
select count(*) from fpc where SKey in (201701, 201702)
因為 SKey 是 int 類型,如果我將上面的查詢更改為
select count(*) from fpc where SKey in ('201701', '201702')
性能會下降。
我在一張表(有數百萬行)上對此進行了測試。問題是為什麼我在執行計劃和時間上沒有看到任何差異。
我在 SKey 上有非聚集列儲存索引。
每個 SKey 大約有 2000 萬行,我有大約 100 個不同的 SKey
隱式轉換的問題在於它會妨礙索引的有效使用。如果必須將函式應用於列以獲取正確的比較值,則無法在搜尋中使用該列上的索引查找。
但是,當 SQL Server 必須比較不同類型的值時,它必須決定要轉換哪個值。它根據其數據類型優先規則執行此操作。
如果您查看該頁面,您會發現
integer
值的優先級高於varchar
值。因此,該varchar
值是被轉換的值。在您提供的範例中,索引列是一
integer
列,硬編碼值是varchar
(或char
,或nvarchar
- 的優先級均低於integer
)。因此,硬編碼值被轉換為整數。由於您的列沒有經過轉換,因此仍然可以使用索引。
注意:這不是唯一的因素。例如,在同一“族”(例如,
int
和bigint
)中的不同數據類型之間的轉換仍將允許索引查找,而不管索引列是哪種數據類型。這就是為什麼應該盡可能匹配數據類型,或者在需要時對非索引數據使用顯式轉換;通過控制轉換過程,通常可以避免該問題。
就個人而言 - 這種優先順序長期以來一直令人煩惱。如果您有需要與數值比較的字元值,除非您顯式執行轉換,否則 SQL Server 將嘗試將字元值(並不總是具有有效的數字表示)轉換為數字,而不是轉換數值(應始終具有有效的字元表示)。嘆。
Bob Klimes指出了幾篇相關文章:
- 導致索引掃描的隱式轉換,由 Jonathan Kehayias 撰寫,它進行測試以查看哪些數據類型在隱式轉換時會導致索引掃描;和
- 數據類型不匹配並不總是導致“糟糕的”隱式轉換和索引掃描,作者 Kendra Little,它涵蓋了同一“系列”中不同類型之間的隱式轉換仍然允許索引查找而不是索引掃描的事實。