2009-04-08 65 views
0

我们有一个表中有35行的数据库时,根据SQL表中选择或计算所有的行

exec sp_spaceused Department.

我能够运行

SELECT TOP 1 * FROM Department,

,并得到一个结果反应迟钝,但是当我运行

SELECT COUNT(*) FROM Department,

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

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

回答

5

桌子上是否有锁,可以阻止您阅读某些行?

尝试:

sp_lock 
+0

我不会认为会影响计数(*) - 一个体面的数据库管理系统应该保持行数分开的速度。 – paxdiablo 2009-04-08 10:50:07

+0

AFAIK,SQL Server不是 – 2009-04-08 11:03:19

0

你以为会怎样做个简单和快速的查询实际上导致表扫描,这是有效地从磁盘读取所有数据页,并遍历每个记录。这是非常贵。您可以使用this method,但我无法确定它是否准确。

2

如果您的表格确实有35行,则不需要两分钟。即使你的表有数十亿行,一个体面的DBMS也会存储行数以提高效率(我不知道微软是这么做的)。

请记住,“top 1”只会以(看似)随机顺序排列第一行,所以它会很快。

我的第一个想法是数据库损坏 - 执行以下操作时会发生什么?

select top 2 * from Department 
select top 3 * from Department 
select top 4 * from Department 

等等。

1

找出发生了什么的最好方法是跟踪查询的执行,但我不知道如何在SQL Server中执行此操作。

您也可以尝试查看查询的执行计划,这可能会告诉您是否在封面下发生了意外事件(例如,如果Department真的是一个复杂的视图)。

想象该表有一个名为部门编号主键,始终是一个正整数,你可以尝试这样的:

SELECT COUNT(*) FROM Department WHERE Department_ID > 0 

这可能迫使扫描索引,而不是实际的表。

2

此查询是否快速返回?

SELECT COUNT(*) FROM Department WITH (NOLOCK) 

如果是这样,我肯定会说有一个锁定在你的表/索引上,正如已经建议的那样。

Marc

1

检查表格上的触发器。同时获得性能监视器,以便您可以看到服务器如何处理资源。