繁体   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