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

时间:2014-09-03 14:18:20

标签: sql sql-server performance

当访问具有相当大的表的数据库时,我当前的查询运行速度非常慢

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

正如您所看到的,IN子句有几千个值。此查询大致每秒执行一次。

是否有另一种方法来编写它以提高性能?

4 个答案:

答案 0 :(得分:4)

将IN的元素添加到索引临时(如果元素更改)或永久表(如果元素是静态的)和内部联接。

答案 1 :(得分:3)

这是您的查询:

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

查询没问题。在table1(id, timestamp)上添加索引。

答案 2 :(得分:2)

最佳答案取决于如何选择这些element ID列表,但这一切都归结为一件事:将它们放入可以加入的某个地方。这将极大地帮助提高性能。但同样,这里真正的问题是如何最好地将这些项目放入表中,这将取决于尚未包含在问题中的信息。

答案 3 :(得分:0)

你应该检查你的执行计划,我猜你可能会有一个参数嗅探问题。检查实际行是否偏离预期值。你可以将IN重写为EXISTS,它在内部工作就像一个INNER JOIN。