簡體   English   中英

加速SQL Server存儲過程

[英]Speeding up SQL Server stored procedure

我真的需要幫助加快SQL Server中的以下查詢。 現在我把它作為一個視圖,但我不在乎它是一個視圖還是一個函數,我只需要它將記錄集返回到MS Access接口。 查詢需要11秒才能執行,但是通過它所經歷的所有周期,我需要將其縮短到3秒或更短的時間。 我試圖索引我現在的視圖,但不幸的是,如果我要索引任何東西,我不能使用AVG函數或使用HAVING子句。

SELECT tblFi.fldFN
    ,tblFc.fldFC
    ,tblFc.fldCity
    ,tblFc.fldState
    ,tblFi.fldIN
    ,tblAPL.fldPK
    ,tblAPL.fldCI
    ,AVG(tblAPD.fldND) AS fldND
FROM tblAPD
INNER JOIN tblAPL ON tblAPD.fldLK = tblAPL.fldLID
INNER JOIN tblUA ON tblAPD.fldUAK = tblUA.fldUAID
INNER JOIN tblUL ON tblUA.fldULK = tblUL.fldULID
INNER JOIN tblFi ON tblUL.fldFK = tblFi.fldFID
INNER JOIN tblFc ON tblFi.fldFAC = tblFc.fldFacID
GROUP BY tblFi.fldFN
    ,tblFc.fldFac
    ,tblFc.fldCity
    ,tblFc.fldState
    ,tblFi.fldIN
    ,tblAPL.fldPK
    ,tblAPL.fldCI
    ,tblAPL.fldPG
    ,tblAPD.fldIG
HAVING (tblAPL.fldCI <> 0) 
AND (AVG(tblAPD.fldND) IS NOT NULL) 
AND (tblAPL.fldPG = 1) 
AND (tblAPD.fldIG = 0)

以下是表格(我只包括查詢中引用的列的偽名稱,然后fld1,fld2,fld3用於那些不相關的列)...

tblAPL - 450萬行, fldLID聚簇索引

fldLID... INT
fld1... FLOAT
fldCI... FLOAT
fldPK... BIGINT
fldPG... TINYINT
fld2... TINYINT
fld3... TINYINT
fld4... NVARCHAR(15)
fld5... DATETIME
fld6... TINYINT
fld7... TINYINT

tblAPD - 1200萬行, fldDID聚簇索引

fldND... FLOAT
fldLK... INT
fldUAK... INT
fldIG... TINYINT
fld1... SMALLINT
fld2... SMALLINT
fld3... SMALLINT
fld4... NVARCHAR(20)
fld5... TINYINT
fldDID... INT

tblUA - 850,000行, fldUAID聚簇索引

fldULK... INT
fldUAID... INT
fld1... NVARCHAR(10)
fld2... INT
fld3... NVARCHAR(15)
fld4... INT
fld5... TINYINT
fld6... NVARCHAR(10)
fld7... INT
fld8... TINYINT
fld9...TINYINT
fld10...TINYINT

tblUL - 200,000行, fldULID聚簇索引

fldULID... INT
fldFK... INT
fld1... INT
fld2... INT
fld3... INT
fld4... NVARCHAR(15)
fld5... DATETIME
fld6... DATETIME

您可以先添加SET NOCOUNT ON; 這應該會加快它的速度。

您是否嘗試將HAVING子句更改為簡單的WHERE子句? 你真正無法移動到WHERE子句的唯一部分是第二行(帶有AVG語句的那一行),對嗎? 這可能會加快速度,因為在生成整個結果集之前不會評估HAVING條件。

SELECT tblFi.fldFN
    ,tblFc.fldFC
    ,tblFc.fldCity
    ,tblFc.fldState
    ,tblFi.fldIN
    ,tblAPL.fldPK
    ,tblAPL.fldCI
    ,AVG(tblAPD.fldND) AS fldND
FROM tblAPD (NOLOCK)
INNER JOIN tblAPL (NOLOCK) ON tblAPD.fldLK = tblAPL.fldLID
INNER JOIN tblUA (NOLOCK) ON tblAPD.fldUAK = tblUA.fldUAID
INNER JOIN tblUL (NOLOCK) ON tblUA.fldULK = tblUL.fldULID
INNER JOIN tblFi (NOLOCK) ON tblUL.fldFK = tblFi.fldFID
INNER JOIN tblFc (NOLOCK) ON tblFi.fldFAC = tblFc.fldFacID
GROUP BY tblFi.fldFN
    ,tblFc.fldFac
    ,tblFc.fldCity
    ,tblFc.fldState
    ,tblFi.fldIN
    ,tblAPL.fldPK
    ,tblAPL.fldCI
    ,tblAPL.fldPG
    ,tblAPD.fldIG
WHERE (tblAPL.fldCI <> 0) 
AND (tblAPL.fldCI = 1) 
AND (tblAPD.fldIG = 0)
HAVING (AVG(tblAPD.fldND) IS NOT NULL)

創建一個非聚集索引(fldCI)和(fldIG)希望你有一個所有外鍵的索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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