2016-08-11 35 views
1

我使用了以下内容:“高性能”条件COUNT(*)?

SELECT 
    COUNT(*) 
FROM 
    [User] 
Where 
    Username like '%m%' 

,结果是在同一时间返回如下:

SELECT 
    * 
FROM 
    [User] 
Where 
    Username like '%m%' 

怎样做一个有条件的计数的最快方法?

+0

你还试过了什么,结果是什么?恩。 'COUNT(1)'等 – Nicarus

+1

查询速度几乎总是由“where”子句后面的内容定义的。因此您的查询运行时间相似。要加快查询速度,您可以在用户名列上创建一个索引。你已经有了吗? – QuickPrototype

回答

-2

当您在COUNT中使用*时,您将获取查询中不需要的所有数据。只需使用任何常量来计算返回的行。

SELECT 
    COUNT(1) 
FROM 
    [User] 
Where 
    Username like '%m%' 
+0

谢谢!我尝试过这一点,它使我在超过14万条记录上获得了25%的提升。没有我期望的那么实质。 – RobVious

+0

这是不正确的。阅读(1)https://social.msdn.microsoft.com/Forums/sqlserver/en-US/31795984-ea62-4b2c-8c78-6e986f2bcea0/count-1-vs-count-?forum=transactsql(2)和https://msbiskills.com/2015/09/16/sql-server-count1-vs-count-vs-count100-which-one-is-fastest/ –

+0

查询中的botleneck是'like%m%',因为谓词不可SARGable。 –

1

你得到,因为non-sargeable的执行可比的时间LIKE与领先%符号比较。

这样,它必须查看行,不能从统计信息或索引中提取信息 - 必须访问表。

+0

索引可以提高性能。由于只返回一个计数,因此不需要读取除WHERE子句中引用的列以外的行数据。索引扫描可以提供更好的性能,而不是表扫描。它取决于索引列的宽度与行的宽度。 – HABO