选择或计算所有行时,Sql表无响应

时间:2009-04-08 10:43:50

标签: sql sql-server select

根据

,我们在数据库中有一个包含35行的表
exec sp_spaceused Department.

我可以运行

SELECT TOP 1 * FROM Department,

得到一个结果,但是当我跑

SELECT COUNT(*) FROM Department,

它运行时间超过2分钟(然后我取消了它并且没有等待结果,因为我希望这是一个简单而快速的查询)。

这可能是什么原因?你有什么建议吗?

6 个答案:

答案 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,但我无法确定它是否准确。