当访问具有相当大的表的数据库时,我当前的查询运行速度非常慢
SELECT *
FROM table1
WHERE timestamp BETWEEN 635433140000000000 AND 635433150000000000
AND ID IN ('element1', 'element2', 'element3', ... , 'element 3002');
正如您所看到的,IN
子句有几千个值。此查询大致每秒执行一次。
是否有另一种方法来编写它以提高性能?
答案 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。