簡體   English   中英

查詢花費的時間太長,無法在LINQ中執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM