根据
,我们在数据库中有一个包含35行的表exec sp_spaceused Department.
我可以运行
SELECT TOP 1 * FROM Department,
得到一个结果,但是当我跑
时SELECT COUNT(*) FROM Department,
它运行时间超过2分钟(然后我取消了它并且没有等待结果,因为我希望这是一个简单而快速的查询)。
这可能是什么原因?你有什么建议吗?
答案 0 :(得分:5)
桌子上是否打开了阻止你阅读某些行的锁?
尝试:
sp_lock
答案 1 :(得分:2)
如果你的桌子确实有35行,那么它不应该花费两分钟。即使你的表有数十亿行,一个体面的DBMS也会存储行数以提高效率(我不知道微软是否会这样做)。
请记住,“top 1”只会获得(看似)随机顺序中的第一行,因此它会很快。
我的第一个想法是数据库损坏 - 执行以下操作时会发生什么?
select top 2 * from Department
select top 3 * from Department
select top 4 * from Department
等等。
答案 2 :(得分:2)
此查询是否会快速恢复?
SELECT COUNT(*) FROM Department WITH (NOLOCK)
如果是这样,我肯定会说你的桌子/索引上存在某种锁定,正如所建议的那样。
马克
答案 3 :(得分:1)
找出正在发生的事情的最好方法是跟踪查询的执行情况,但我不知道如何在SQL Server中执行此操作。
您还可以尝试查看查询的执行计划,该计划可能会显示封面下是否发生了意外情况(例如,如果部门确实是一个复杂的视图)。
想象一下这个表有一个名为Department_ID的主键,它总是一个正整数,你可能会尝试类似的东西:
SELECT COUNT(*) FROM Department WHERE Department_ID > 0
这可能会强制它扫描索引而不是实际的表。
答案 4 :(得分:1)
检查表格上的触发器。还要获得性能监视器,以便了解服务器对资源的处理方式。
答案 5 :(得分:0)
您希望简单快速的查询实际上会导致表扫描,它有效地从磁盘读取所有数据页并迭代每条记录。这非常昂贵。您可以使用this method,但我无法确定它是否准确。