我需要一个查询来选择具有最小插入日期时间的行。但是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;
答案 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
再次,这可能会更糟!测试它并比较执行时间和负载。