【发布时间】:2014-03-22 11:07:32
【问题描述】:
我的表中有 440 行与我的以下查询匹配
SELECT RecordID
FROM
[tblRules]
WHERE
DATEDIFF(MONTH,CreationDate,GETDATE()) >= 6
AND YEAR(CreationDate) = 2013
ORDER BY RecordID , BR_ID
当我执行这个查询时,我会在 4 秒内得到 440 行
当我像下面那样做顶部时,
SELECT TOP 440 RecordID
FROM
[tblRules]
WHERE
DATEDIFF(MONTH,CreationDate,GETDATE()) >= 6
AND YEAR(CreationDate) = 2013
ORDER BY RecordID , BR_ID
它在 7 秒内返回 440 行
但是当我设置高顶数时它会永远运行而不返回结果我给它一个完整的运行时它运行直到服务器的内存缓冲区满了5个小时我运行的查询是
SELECT TOP 500 RecordID
FROM
[tblRules]
WHERE
DATEDIFF(MONTH,CreationDate,GETDATE()) >= 6
AND YEAR(CreationDate) = 2013
ORDER BY RecordID , BR_ID
即使我将500 替换为440 以外的任何内容,它也会运行并且永远不会返回结果。我在很多事情上苦苦挣扎,谁能给我任何解决方案或为什么会发生这种情况。该数据库中的所有其他表都工作正常。表 tblRules 中有超过 10 亿条记录。
【问题讨论】:
-
在 CreationDate 上放置一个索引 - 看看是否有变化。
-
我认为这是一个硬件问题,SQL 可以在不到一秒的时间内查询到,即使没有 440 条记录的索引,除非你有数百万/数十亿。
-
@PreetSangha 已经被索引了,当
top的记录数在它的范围内时它可以正常工作,但当它超出范围时就不行 -
@Jade 是的,如果是硬件问题,我的记录在该表中超过了数十亿,它应该在其他查询中也给出这一点
-
@PreetSangha 感谢队友的建议,但
Satheesh解决方案正在发挥作用,问题是条件使我的索引和优化器无法运行的功能,因此它需要永远运行。感谢您的帮助
标签: sql sql-server performance tsql sql-server-2008-r2