我认为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快速执行计数?
答案 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();