簡體   English   中英

如何在SQL Server中使大型IN子句更有效?

[英]How can I make large IN clauses more efficient in SQL Server?

當訪問具有很大表的數據庫時,我當前的查詢運行非常慢

SELECT * 
FROM table1
WHERE timestamp BETWEEN 635433140000000000 AND 635433150000000000
  AND ID IN ('element1', 'element2', 'element3', ... , 'element 3002');

如您所見, IN子句具有數千個值。 該查詢大約每秒執行一次。

還有另一種編寫方法來提高性能的方法嗎?

將IN的元素添加到索引臨時(如果元素更改)或永久表(如果元素是靜態的)中,並對其進行內部聯接。

這是您的查詢:

SELECT *
FROM table1
WHERE timestamp BETWEEN 635433140000000000 AND 635433150000000000 AND
      ID IN ('element1', 'element2', 'element3', ... , 'element 3002');

查詢很好。 table1(id, timestamp)上添加索引。

最佳答案取決於如何選擇那些element ID列表,但這全都取決於一件事:將它們放入表中可以加入的地方。 這將極大地提高性能。 但是,這里真正的問題是如何最好地將這些項目放入表格中,這將取決於問題中尚未包括的信息。

您應該檢查執行計划,我猜您可能由於兩者之間的原因而導致參數嗅探問題。 檢查實際行是否偏離您的期望值。 然后,您可以將IN重寫為EXISTS,它在內部的工作方式類似於INNER JOIN。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM