我有以下查詢,我在我的sqlite DB上運行:
我有以下查詢。
SELECT * FROM ServicesData
WHERE JobID IN (
SELECT JobID
FROM ServicesData
WHERE JObID IS NOT NULL
GROUP BY JobID
ORDER BY MAX(Time) DESC LIMIT 3)
)
ORDER BY Time;
(這可以得到最近3個作業的所有條目,請看這里的表格和結果最近N個作業的條目的SQL查詢)
。在 LinqPad 中針對我的 sqlite DB 運行該查詢需要 0.02 秒。
我試圖在EF Core中把這個問題翻譯成linq-to-sql
我試過:ServicesData。 Where(x => ServicesData。
.Where(y => y.JobID! =null)
.GroupBy(y => y.JobID)
.OrderByDescending(span class="hljs-params">y => y. Max(z => z.Time)
.Select(y => y.Key)
.Take(3)
.Contains(x.JobID)
)
這似乎給出了與上述SQL相同的正確結果
。然而LinqPad顯示了以下SQL:
SELECT *
FROM "ServicesData" AS "s"
WHERE EXISTS (
SELECT 1
FROM (
SELECT "s0"."JobID", MAX("s0"."time") AS "c"。
FROM "ServicesData" AS "s0"
WHERE "s0"."JobID" IS NOT NULL
GROUP BY "s0"."JobID"
ORDER BY MAX("s0"."Time") 串列
LIMIT 3。
) AS "t"/span>
WHERE ("t"."JobID" = "s"."JobID") OR ("t". "JobID" IS NULL AND "S". "JobID" IS NULL))
而且它非常慢,需要2.6秒!
由于某些原因,contains沒有被翻譯成IN運算子
我做錯了什么?
uj5u.com熱心網友回復:
查詢本身需要2.6秒,還是說這是為所產生的3個作業取回你的物體所需的時間? EF將物體物體化需要時間,所以它永遠不會像原始SQL吐出的結果那樣快。
盡管如此,從該查詢中,這部分似乎有點令人擔憂:
OR("t". "JobID" IS NULL AND "S". "JobID" IS NULL))
由于內部查詢只考慮不為空的作業ID,上面的陳述句不應該改變結果,但說實話,它不是必須的。EF生成EXISTS而不是IN子句在SQL生成中是相當常見的,一般來說不應該造成明顯的性能損失。
你可以試試:
ServicesData。 Where(x => x.JobID !=null)
&& ServicesData !
.Where(y => y.JobID! =null)
.GroupBy(y => y.JobID)
.OrderByDescending(span class="hljs-params">y => y. Max(z => z.Time)
.Select(y => y.Key)
.Take(3)
.Contains(x.JobID)
.OrderBy(x => x.Time) 。
我很好奇,這是否剝去了額外的Null = Null津貼。
EF是一個有用的工具,但在一天結束時,它需要生成SQL來覆寫許多可能的操作的排列組合,所以不能期望它在所有情況下都能選擇最有效的SQL。有時,使用兩個更簡單的查詢,或者求助于明確生成的 SQL 陳述句/Sproc 可能是合理的。
例如:
var jobIds = ServiceData. Where(x => x.JobID !=null)
.GroupBy(x => x.JobID)
.OrderByDescending(span class="hljs-params">x => x. Max(y => y.Time)
.Select(x => x.Key)
.Take(3)
.ToList()。
var serviceData = ServiceData. Where(x => jobIds.Contains(x.JobId))
.OrderBy(x => x.Time)
.ToList()。
這是一個權衡性能與可能引入的復雜作業方式的問題,以避免EF的生成規則可能存在的昂貴性能陷阱。
uj5u.com熱心網友回復:
事實上,你并沒有做錯什么! 這是我遇到過很多次的EF問題!
當你在一列x上group by,然后在x上應用contains,你會得到這樣一個翻譯成SQL的結果!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/309855.html
標籤:
上一篇:量化交易 米筐 策略回測總結
