我们有一个表中有35行的数据库时,根据SQL表中选择或计算所有的行
exec sp_spaceused Department.
我能够运行
SELECT TOP 1 * FROM Department,
,并得到一个结果反应迟钝,但是当我运行
SELECT COUNT(*) FROM Department,
运行时间超过2分钟(然后我取消它,并没有等待结果,因为我期望这做一个简单而快速的查询)。
这是什么原因?你有什么建议吗?
我们有一个表中有35行的数据库时,根据SQL表中选择或计算所有的行
exec sp_spaceused Department.
我能够运行
SELECT TOP 1 * FROM Department,
,并得到一个结果反应迟钝,但是当我运行
SELECT COUNT(*) FROM Department,
运行时间超过2分钟(然后我取消它,并没有等待结果,因为我期望这做一个简单而快速的查询)。
这是什么原因?你有什么建议吗?
桌子上是否有锁,可以阻止您阅读某些行?
尝试:
sp_lock
你以为会怎样做个简单和快速的查询实际上导致表扫描,这是有效地从磁盘读取所有数据页,并遍历每个记录。这是非常贵。您可以使用this method,但我无法确定它是否准确。
如果您的表格确实有35行,则不需要两分钟。即使你的表有数十亿行,一个体面的DBMS也会存储行数以提高效率(我不知道微软是这么做的)。
请记住,“top 1”只会以(看似)随机顺序排列第一行,所以它会很快。
我的第一个想法是数据库损坏 - 执行以下操作时会发生什么?
select top 2 * from Department
select top 3 * from Department
select top 4 * from Department
等等。
找出发生了什么的最好方法是跟踪查询的执行,但我不知道如何在SQL Server中执行此操作。
您也可以尝试查看查询的执行计划,这可能会告诉您是否在封面下发生了意外事件(例如,如果Department真的是一个复杂的视图)。
想象该表有一个名为部门编号主键,始终是一个正整数,你可以尝试这样的:
SELECT COUNT(*) FROM Department WHERE Department_ID > 0
这可能迫使扫描索引,而不是实际的表。
此查询是否快速返回?
SELECT COUNT(*) FROM Department WITH (NOLOCK)
如果是这样,我肯定会说有一个锁定在你的表/索引上,正如已经建议的那样。
Marc
检查表格上的触发器。同时获得性能监视器,以便您可以看到服务器如何处理资源。
我不会认为会影响计数(*) - 一个体面的数据库管理系统应该保持行数分开的速度。 – paxdiablo 2009-04-08 10:50:07
AFAIK,SQL Server不是 – 2009-04-08 11:03:19