优化表中的选择计数(*)

时间:2016-04-28 19:35:01

标签: sql sql-server

我的表 Eli 有100万条记录。当我查询以下内容时:

Select count(*) from Eli where userId ='my_user'

结果需要10分钟以上。我搜索了网页,发现了从http://dbatipster.blogspot.com/2009/08/get-row-counts-fast.html优化查询的更好方法。

如何在以上查询中使用以下查询 -

SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count] 
FROM sys.sysindexes i WITH (NOLOCK) 
WHERE i.indid in (0,1) 
ORDER BY i.rowcnt desc

4 个答案:

答案 0 :(得分:1)

如果没有触及正确构建表格,我会使用类似的东西:

SELECT COUNT(userID) FROM Eli (NOLOCK)
WHERE userId ='my_user'

(NOLOCK)提示允许您从表中选择而不提交针对提交的Eli表的其他事务,这意味着您不会在返回结果之前等待其他更新和插入完成。

答案 1 :(得分:0)

CREATE VIEW dbo.vwEli
WITH SCHEMABINDING
AS
    SELECT userId, cnt = COUNT(*)
    FROM Eli
GO

CREATE CLUSTERED INDEX ix ON dbo.vwEli (userId)
GO

SELECT cnt
FROM dbo.vwEli --WITH(NOEXPAND)
WHERE userId = 'my_user'

答案 2 :(得分:0)

  

结果需要10分钟以上

超过100万行的花了不长的时间。你吠树了。完全。在一个滑稽的水平 - 就像抱怨一辆破损的油箱泄漏燃料的汽车的油耗。严重。

你可能会花费那么长时间的唯一原因是锁定过度 - 这是你应该解决的问题。 100万行没什么。即使是在那个时代的慢速硬盘上使用10年历史的计算机,也不需要花一分钟时间来进行查询。这里阻止了一些东西。可能是由一个不称职的程序员编写的其他代码,它可以保持锁定的时间长于它需要的时间,甚至可能是过多的锁定。

答案 3 :(得分:-1)

如果您打算在查询中经常使用userID过滤器,那么看到改进的简单修复就是在userID上的表上添加一个索引。当然,如果userID是表的主键,则索引不是必需的,也可能是改进需要检查的其他方法。 现在,您应该提供您提供的查询,以便您更轻松:

SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count] 
FROM sys.sysindexes i WITH (NOLOCK) 
WHERE i.indid in (0,1) 
AND OBJECT_NAME(i.id) = 'Eli';

您发布的原始查询按行数的降序列出了数据库中所有对象的行数。