Sql-Server

IN 子句中的冗餘條目

  • November 16, 2020

我有一個動態建構的查詢,其中包含如下所示的 where 子句:

where column in ('a', 'a', 'a', 'b')

實際數據要長很多,有很多重複項,如上面的範例中a重複了 3 次。

使用具有大量值的非常大WHERE的子句是否存在潛在的性能影響,其中許多是重複的?IN

這很容易測試。

USE tempdb;

CREATE TABLE dbo.d
(
   col varchar(1)
);

INSERT INTO dbo.d (col)
VALUES ('a')
   , ('b');
GO

啟用“實際”執行計劃,然後執行:

SELECT *
FROM dbo.d
WHERE d.col IN ('a', 'b', 'a', 'b', 'c');

結果非常清楚地表明,SQL ServerIN (...)在執行查詢之前從子句中消除了重複項。

在此處輸入圖像描述

請注意,如果IN (...)包含足夠多的重複項,則查詢的執行可能會比不存在這些重複項的情況更差。性能不佳的原因可能包括:

  1. 客戶端可能難以為該IN子句編譯項目列表。
  2. IN隨著子句中的項目越多,查詢優化器所花費的時間顯然會有所增加。
  3. IN如果查詢是通過網路發送的,如果需要編譯、發送和接收多個 TCP 數據包,則子句中的一長串項目可能會導致更高的延遲。

如果查詢被非常頻繁地發送到伺服器,則上面列出的項目將更加複雜。

如果列表足夠大,僅文本的大小就會以其他方式導致性能問題,例如編譯時間(僅解析事物)和通過網路發送查詢。因此,僅僅因為執行計劃沒有顯示它,並不意味著這些附加值不會對性能產生影響。

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