【问题标题】:Optimal Count() operation from a DB using LINQ to SQL使用 LINQ to SQL 的数据库中的最佳 Count() 操作
【发布时间】:2012-05-02 05:31:30
【问题描述】:

DBA 告诉我,在使用 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();

【问题讨论】:

  • DBA 告诉过你什么?优化器通常对它们进行相同的解释。
  • 在大多数 RDBMS 上,这不会产生任何影响......并且 如果有(通常不会),count(1) 将是,可能,甚至更好。但是,关于您最后的“性能更高”的问题-您尝试过吗?特别是,捕获用于两个查询的 SQL,看看是否不同。如果它不同,则在启用 stats-io 等的情况下双向运行。
  • @JeremyHolovacs 你想要他的 SSN 吗? :) - 说真的:这是一个与我共事的人,从表面上看,从不质疑。从 cmets 和接受的答案看来,我被告知的内容是错误的。感谢大家解决这个问题!

标签: c# performance tsql linq-to-sql


【解决方案1】:

据我了解,您的两个 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 Entites,它们再次生成相同的 SQL,但现在是

SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[TableName] AS [Extent1]
)  AS [GroupBy1]

【讨论】:

    【解决方案2】:

    我知道这是一个旧的,但要小心 sql server! Count 不计算空值,因此如果您的主键字段可以为空,则这两个语句可能不等价。见

    create table #a(col int null)
    
    insert into #a values (null)
    
    select COUNT(*) 
    from #a;
    
    select COUNT(col)
    from #a;
    

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      相关资源
      最近更新 更多