Sql-Server

隱式轉換不影響性能

  • February 14, 2022

我已經閱讀過關於索引的隱式轉換會影響性能,因此在以下查詢中意味著

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)。

因此,硬編碼值被轉換為整數。由於您的列沒有經過轉換,因此仍然可以使用索引。

注意:這不是唯一的因素。例如,在同一“族”(例如,intbigint)中的不同數據類型之間的轉換仍將允許索引查找,而不管索引列是哪種數據類型。

這就是為什麼應該盡可能匹配數據類型,或者在需要時對非索引數據使用顯式轉換;通過控制轉換過程,通常可以避免該問題。

就個人而言 - 這種優先順序長期以來一直令人煩惱。如果您有需要與數值比較的字元值,除非您顯式執行轉換,否則 SQL Server 將嘗試將字元值(並不總是具有有效的數字表示)轉換為數字,而不是轉換數值(應始終具有有效的字元表示)。嘆。


Bob Klimes指出了幾篇相關文章:

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