[英]Linq slow while SQL fast
当我尝试下一个linq查询时,它很慢(1.5 s):
var rslt = (from t in context.Set<SUB_Transactions>()
where
t.UpdateDate > query.LastUpdate &&
t.TransactionID > query.Index
select new
{
TransactionID = t.TransactionID
}).OrderBy(t => t.TransactionID).Take(query.Amount).ToList();
转换为SQL时,此查询非常快(40毫秒):
SELECT TOP (300)
[Project1].[TransactionID] AS [TransactionID]
FROM ( SELECT
[Extent1].[TransactionID] AS [TransactionID]
FROM [dbo].[SUB_Transactions] AS [Extent1]
WHERE ([Extent1].[UpdateDate] > @p__linq__0) AND ([Extent1].[TransactionID] > @p__linq__1)
) AS [Project1]
ORDER BY [Project1].[TransactionID] ASC
这里发生了什么?
删除第一个查询中的“汇整Take
也会带来快速的结果(考虑到没有新的交易会很快)
在TransactionID
和UpdateDate
上有一个复合索引。
就您的示例而言,这可以使您的查询更快,但是如果没有一些示例数据,就不可能从我们的角度进行测试:
var rslt = (from t in context.Set<SUB_Transactions>()
where t.TransactionID > query.Index // invert order of filter
&& t.UpdateDate > query.LastUpdate
order by t.TransactionID // you can orderby here
select t.TransactionID) // remove anonymous object
.Take(query.Amount)
.AsNoTracking() // you won't be changing IDs so no need to track them
.ToList();
您可能还获得一些性能提升,如果你使用的DbSet<SUB_Transactions>
不是调用Set<SUB_Transactions>()
其需要找到DbSet
中DbContext
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.