我有以下實體框架的查詢性能問題:實體框架總和()的性能
using (MyEntities context = new MyEntities())
{
return context.Companies
.Single(c => c.CompanyId == company.CompanyId)
.DataFile.Sum(d => d.FileSize);
}
當SQL事件探查器跟蹤,我看到下面的SQL命令:
exec sp_executesql N'SELECT
[Extent1].[DataFileID] AS [DataFileID],
[Extent1].[LocalFileName] AS [LocalFileName],
[Extent1].[ServerFileName] AS [ServerFileName],
[Extent1].[DateUploaded] AS [DateUploaded],
[Extent1].[FileSize] AS [FileSize],
[Extent1].[CompanyID] AS [CompanyID]
FROM [dbo].[DataFile] AS [Extent1]
WHERE [Extent1].[CompanyID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=16
從什麼我可以看到,所有的數據文件行都被返回(超過10,000)到內存中,然後發生Sum()
。
編輯:
按Patryk的建議,我已經改變了查詢到這一點:
using (MyEntities context = new MyEntities())
{
return context.Companies
.Where(c => c.CompanyId == company.CompanyId)
.Select(x => x.DataFiles.Sum(d => d.FileSize))
.Single();
}
和SQL跟蹤看起來是這樣的:
SELECT TOP (2)
(
SELECT
SUM([Extent2].[FileSize]) AS [A1]
FROM
[dbo].[DataFile] AS [Extent2]
WHERE
[Extent1].[CompanyId] = [Extent2].[CompanyID]
) AS [C1]
FROM
[dbo].[Company] AS [Extent1]
WHERE
[Extent1].[CompanyId] = 16
這是多少更好,但是,基本上我只想要這樣簡單而快速的東西:
SELECT SUM(FileSize) FROM DataFile WHERE CompanyId = 16
可能更改查詢一點點,使它看起來更加SQL十歲上下會做的伎倆:'context.Companies.Where(C => ...)選擇(X => x.DataFile.Sum(d => d.FileSize))。Single()'。這樣表達式訪問者可能會輕鬆一點,生成的SQL可能會更好;如果它沒有幫助,你可以在'Select'之後手動調用'AsEnumerable',看看是否改變了任何東西。 –
謝謝。看我的編輯:) – davenewza
@PatrykĆwiek正確的優化,但推理是不好的。問題歸結爲延遲加載。 – Aron