主键计数LINQ中的计数非常慢

时间:2009-05-14 08:35:03

标签: .net linq-to-sql

我认为LINQ to SQL是针对性能而调整的?

以下用于计数的LINQ to SQL非常差

Dim uniqueFactors As Integer = db.LargeTable.Distinct.Count

产生

SELECT COUNT(*) AS [value]
FROM [dbo].[LargeTable] AS [t0]
WHERE ([t0].[ID] % @p0) = @p1

如何根据主键计算记录数的最快方法是

SELECT  @totalRowCount = rows
FROM    sysindexes
WHERE   id = OBJECT_ID('LargeTable')
    AND indid < 2

所以问题是,在询问Count(*)时,如何确保LINQ to SQL快速执行计数?

5 个答案:

答案 0 :(得分:2)

嗯,这取决于你的期望。如果你在表上要求“Distinct.Count”,那么你就是在指示LINQ完全按照它的方式行事。由于这会导致表扫描,因此对于较大的表来说会很慢。

SELECT COUNT(*)是SQL Server(以及LINQ)为您提供表中行精确,最新计数的唯一方法。

从sysindexes中选择一行(或者最好是:SQL Server 2005及以上版本的sys.partitions - 不推荐使用“sysindexes”视图)会给你一个近似数字 - 但不能保证绝对正确和最新。

基本上,LINQ缺少的是“UseApproximationForPerformancesSake”开关。这有时可能会有所帮助 - 但是,如果您需要快速且只有近似的响应,那么您可以随时使用这一小块SQL并自行查询数据库。

马克

答案 1 :(得分:1)

我有一个类似的问题,我尝试了这些并且效果更好:

child.count(x =&gt; x.paretnID == inputParentID)child.where(x =&gt; x.parentID == inputParentID)

我的原始代码在每次迭代时花了大约15-20秒:return(isEdit)? db.ChasisBuys.Single(x =&gt; x.ChasisBuyID == long.Parse(Request.QueryString [&#34; chbid&#34;]))。Chasises.Count(y =&gt; y.Bikes.Count&gt; 0&amp;&amp; y.ColorID == buyItems [(int)index] .ColorID&amp;&amp; y.ChasisTypeID == buyItems [(int)index] .ChasisTypeID).ToString():&#34; - &# 34 ;;

运行良好的新代码是:

    **return (isEdit) ? db.Chasises.Where(x => x.ChasisBuyID == long.Parse(Request.QueryString["chbid"])).Count(y => y.Bikes.Count > 0 && y.ColorID == buyItems[(int)index].ColorID && y.ChasisTypeID == buyItems[(int)index].ChasisTypeID).ToString() : "-";**

数据库在chasises中有大约1000条记录,在chasisBuys中大约有5条记录,在自行车中大约有20条记录。我的观点是,Linq to SQL查询不会在逻辑语句中进行预先评估,例如,如果您编写&#34;返回&amp;&amp; b&amp;&amp; C。;&#34; if语句a是false,其他语句没有被评估,我在linq中期待这样的事情,但事实并非如此。

答案 2 :(得分:0)

我无法重现您的TSQL;你从问题中省略了部分LINQ查询(即“where”)吗?无论我如何尝试,我都可以获得相当正常的TSQL ......

由于主键是唯一的,为什么不只是:

int count = db.LargeTable.Count();

否则;你试过选择主键吗?

int count = db.LargeTable.Select(x=>x.Id).Distinct().Count();

答案 3 :(得分:0)

将你的linq改为“db.LargeTable。 Distinct。 Count();”

应该产生以下SQL

SELECT COUNT(*) AS [value]
FROM [dbo].[LargeTable] AS [t0]

哪个应该使用索引扫描而不是表扫描。哪个应该快得多。

答案 4 :(得分:0)

如果您正在寻找一个我想要的简单COUNT并且不想永远等待,请不要使用实体方法。

使用简单的LINQ to SQL格式。

int largeCount = (from o in db.LargeTable
                       where o.SomeField == somVal
                       select o).Count();