2016-04-28 30 views
1

我有表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

您是否为'userID'创建了一个索引? – WillardSolutions

+3

100万行不是一个大数字,即使没有覆盖索引,它也不应该运行10分钟来执行全表扫描。 Bte,第二选择只能用于没有任何WHERE条件的行计数。 – dnoeth

回答

1

没有触及上正确建立一个表,我会用这样的:

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

(NOLOCK)提示允许您可以从表中进行选择而无需针对提交的Eli表执行其他事务,这意味着在返回结果之前,您并未等待其他更新和插入操作完成。

+0

对不起,-1,你可能会被解雇。 NOLOCK可能会导致报告错误结果 - 因为行可能会多次包含。由于这个原因,它几乎只适用于只读表格。 – TomTom

+0

@TomTom问题在于,如何优化查询以适应其查询以更快地返回结果。该优化查询的一部分是“NOLOCK”提示,提供有关它的功能的信息。他们可以决定这是否适用于他们正在做的事情。 – Jake

-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'; 

您发布上市数据库中的所有对象的行数中的行数的降序排列的原始查询。

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' 
1

它正在采取超过10分钟给结果

超过1个百万行的cound不会占据那么长时间。你叫错了树。完全。在一个滑稽的层面上 - 比如抱怨一辆汽车的燃油消耗量破损,油箱漏油。认真。

你永远需要这么长时间的唯一原因是锁定过分 - 这是你应该修复的。 100万行没有任何意义。即使在那个时代的慢速硬盘上有10年历史的计算机上,也不需要花费一分钟时间来完成您的查询。有些东西阻塞在这里。可能由一个不合格的程序员编写的其他代码保持锁定的时间比它需要的时间更长,甚至可能过度锁定。