使用LINQ to SQL实现对数据库的最佳Count()操作

4

数据库管理员告诉我,在使用T-SQL时:

select count(id) from tableName

比...更快

select count(*) from tablenName

如果id是主键。

推广到LINQ-TO-SQL上,下面的表述是否准确?

LINQ-to-SQL语句如下:

int count = dataContext.TableName.Select(primaryKeyId => primaryKeyId).Count();

比起这个,它的性能更强大:
int count = dataContext.TableName.Count();

5
哪些数据库管理员告诉了你这个?通常情况下,它们被优化器解释为相同的内容。 - Jeremy Holovacs
1
在大多数关系型数据库管理系统中,这不会有任何区别...即使它有(通常不会),count(1)也可能更好。然而,关于你最后的“更高效”的问题 - 你试过了吗?特别是,捕获两个查询使用的SQL,看看是否不同。如果确实不同,启用stats-io等方式运行两种方法。 - Marc Gravell
@JeremyHolovacs 你想要他的社会安全号码吗?:) - 玩笑话:这是我与某人合作时接受的信息,我从未质疑过。根据评论和被接受的答案来看,我被告知的是错误的。感谢大家帮我澄清这个问题! - Guy
2个回答

6

据我所了解,你的两个select count语句没有任何区别。

使用LINQPad,我们可以检查不同LINQ语句生成的T-SQL。

对于Linq to SQL,以下两个语句:

TableName.Select(primaryKeyId => primaryKeyId).Count();

并且
TableName.Count();

生成相同的SQL。
SELECT COUNT(*) AS [value] FROM [dbo].[TableName] AS [t0]

针对Linq to Entities来说,它们生成相同的SQL,但现在是这样:
SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[TableName] AS [Extent1]
)  AS [GroupBy1]

0

我知道这是一个老问题,但要小心使用SQL Server!Count不会计算空值,因此如果您的主键字段可为空,则这两个语句可能不等效。请参见

create table #a(col int null)

insert into #a values (null)

select COUNT(*) 
from #a;

select COUNT(col)
from #a;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接