我有一個來自在Cold Fusion上運行的舊系統的t-sql查詢。此查詢只需不到一秒鐘即可返回記錄。LINQ查詢中的性能下降
select dateDiff(month, dateAdd(hour, 11, createdAt), {ts '2015-02-28 23:59:59'}) p, count(*) c
from account
where createdAt <= {ts '2015-02-28 23:59:59'}
and accountType = 'business'
and dateDiff(month, dateAdd(hour, 11, createdAt), {ts '2015-02-28 23:59:59'}) <12
group by dateDiff(month, dateAdd(hour, 11, createdAt), {ts '2015-02-28 23:59:59'})
order by dateDiff(month, dateAdd(hour, 11, createdAt), {ts '2015-02-28 23:59:59'})
我現在正在將其轉換爲使用.NET和LINQ的新系統。 我設法寫這個LINQ查詢,它給了我相同的結果。
from a in db.Accounts
where SqlFunctions.DateDiff("Month", SqlFunctions.DateAdd("Hour", 11, a.createdAt), "2015-02-28 23:59:59") < 12
&& a.accountType == "business"
group a by SqlFunctions.DateDiff("Month", a.createdAt, "2015-02-28 23:59:59") into grp
orderby SqlFunctions.DateDiff("Month", grp.FirstOrDefault().createdAt, "2015-02-28 23:59:59")
select new ProgressViewModel.Data
{
date = SqlFunctions.DateDiff("Month", grp.FirstOrDefault().createdAt, "2015-02-28 23:59:59"),
amount = grp.Count()
});
然而,這種查詢採用不小於5秒運行,而與第一個(T-SQL)花費小於1秒。
通過使用Glimpse,我們可以看到LINQ查詢生成的t-sql。它有多個子選擇,比快速查詢長5倍。
我該如何改進LINQ查詢?
有沒有可能給你把上面的查詢到存儲過程並返回結果和在網格中顯示?如果是的話,這是更有效的方式 – Immu 2015-02-11 06:56:52
'grp.FirstOrDefauilt()'看起來可疑 - 你不是指'grp.Key'?另外,爲什麼不'dateAdd'傳遞的參數,而不是數據庫中的值?這應該允許你在'createdAt'上使用索引,如果有的話。 – Luaan 2015-02-11 07:02:34
您能否讓我們知道生成的LINQ查詢的樣子? – JunaidKirkire 2015-02-11 07:07:30