Sql-Server
IN 子句中的冗餘條目
我有一個動態建構的查詢,其中包含如下所示的 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 Server
IN (...)
在執行查詢之前從子句中消除了重複項。請注意,如果
IN (...)
包含足夠多的重複項,則查詢的執行可能會比不存在這些重複項的情況更差。性能不佳的原因可能包括:
- 客戶端可能難以為該
IN
子句編譯項目列表。IN
隨著子句中的項目越多,查詢優化器所花費的時間顯然會有所增加。IN
如果查詢是通過網路發送的,如果需要編譯、發送和接收多個 TCP 數據包,則子句中的一長串項目可能會導致更高的延遲。如果查詢被非常頻繁地發送到伺服器,則上面列出的項目將更加複雜。
如果列表足夠大,僅文本的大小就會以其他方式導致性能問題,例如編譯時間(僅解析事物)和通過網路發送查詢。因此,僅僅因為執行計劃沒有顯示它,並不意味著這些附加值不會對性能產生影響。