[英]Query taking too long to execute in LINQ
我編寫了一個查詢,該查詢應該從一個表中獲取所有行,並對第二個表進行子查詢,從而僅從最新記錄中提取一個值。 在SQL Server中 ,查詢大約需要15秒才能執行,而LINQ查詢大約需要2分鍾。 有人可以幫我將SQL轉換為LINQ嗎,在此過程中我一定做錯了。
SQL
:
SELECT a.isrunning,
worktype = (
SELECT TOP 1
w.worktype
FROM dbo.workorder w WITH (NOLOCK)
WHERE w.assetnum = a.assetnum
ORDER BY w.statusdate DESC
),
a.status,
*
FROM dbo.asset a WITH (NOLOCK)
WHERE a.assetnum IN ('list', 'of', 'asset', 'numbers')
LINQ
查詢:
(
from a in db.assets
let wo = (
from w in db.workorders
where w.assetnum == a.assetnum
orderby w.statusdate descending
select w).FirstOrDefault()
where aliasStrings.Contains(a.assetnum)
select new AssetWithWorkType {
...
}
);
建議在外鍵上具有索引。 還包括過濾和排序子句的索引。 因此,我建議您創建以下3個索引:
CREATE NONCLUSTERED INDEX [IDX_workorder_statusdate] ON dbo.workorder(statusdate)
CREATE NONCLUSTERED INDEX [IDX_workorder_assetnum] ON dbo.workorder(assetnum)
如果asset
表中的assetnum
列不是主鍵,則另外:
CREATE NONCLUSTERED INDEX [IDX_asset_assetnum] ON dbo.asset(assetnum)
您可以為相關的子查詢結果創建一個臨時表,然后再將其聯接。 語法不正確,因為我沒有您的表架構或數據,但是想法是相同的。
CREATE TABLE #workTypes (worktype VARCHAR(X), assetnum VARCHAR(x))
INSERT INTO #workTypes
SELECT TOP 1 worktype, assetnum FROM dbo.workorder ORDER BY statusdate DESC
SELECT a.isrunning,
b.worktype,
a.status,
*
FROM dbo.asset a WITH (NOLOCK)
INNER JOIN #worktypes b
ON a.assetnum = b.assetnum
WHERE a.assetnum IN ('list', 'of', 'asset', 'numbers')
怎么樣:
SELECT a.isrunning,
w.worktype,
cnt = count(*)
FROM dbo.asset a WITH (NOLOCK)
INNER JOIN dbo workorder w WITH (NOLOCK) on w.assetnum = a.assetnum
WHERE a.assetnum IN ('list', 'of', 'asset', 'numbers')
這將為您提供每種資產的工作類型計數,並可能允許數據庫服務器更有效地優化。 還可以考慮添加索引或使用臨時表(如其他答案所示)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.