繁体   English   中英

LINQ慢而SQL快

[英]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也会带来快速的结果(考虑到没有新的交易会很快)

TransactionIDUpdateDate上有一个复合索引。

就您的示例而言,这可以使您的查询更快,但是如果没有一些示例数据,就不可能从我们的角度进行测试:

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>()其需要找到DbSetDbContext

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM