GroupBy查询速度慢是什么其他选项?

时间:2014-08-08 07:27:36

标签: c# sql sql-server linq entity-framework

我需要一个查询来选择具有最小插入日期时间的行。但是groupby查询非常慢

我可以做什么而不是groupby?

如何提高查询的性能?

有没有其他方法可以使用linq编写此查询?

我的表格中的行数大约是 600,000 行并且正在增长

fullsimnumber不是已编入索引但是已删除且insertdatetime 已编入索引

fullsimnumber是一个由三个索引 coloumn prec + cod + subscribec组成的列。

我的问题是linq查询总是提供超时例外。

我将fullsimnumber更改为groupby prec,cod,subscribec,它们已编入索引,但仍然获得tiemout异常

我使用linq到EF,(代码第一种样式),我在sql中的查询是:

SELECT *
FROM dbo.Sim AS t1
    JOIN (SELECT FullSimNumber,MIN(InsertDateTime) AS insd
          FROM dbo.Sim 
          GROUP BY FullSimNumber) AS t2
    ON t1.FullSimNumber = t2.FullSimNumber AND t1.InsertDateTime = t2.insd
WHERE t1.IsDeleted = 0

和我在linq中的查询

from s in ADbContext.Numbers
where !s.IsDeleted
group s by s.FullSimNumber
into g
let sd = g.OrderBy(x => x.InsertDateTime).FirstOrDefault()
select sd;

1 个答案:

答案 0 :(得分:1)

没有关于索引和行数的任何数据,因此很难知道究竟需要什么才能使查询更快。有一点值得尝试的是:

SELECT *
FROM dbo.Sim AS t1
CROSS APPLY (
    SELECT TOP 1 FullSimNumber
        , InsertDateTime AS insd
    FROM dbo.Sim t2
    WHERE t1.FullSimNumber = t2.FullSimNumber
        AND t1.InsertDateTime = t2.insd
    ORDER BY InsertDateTime DESC
    ) AS t2
WHERE t1.IsDeleted = 0

再次,这可能会更糟!测试它并比较执行时间和负载。