简体   繁体   English

加速SQL Server存储过程

[英]Speeding up SQL Server stored procedure

I really need help speeding up the following query in SQL Server. 我真的需要帮助加快SQL Server中的以下查询。 Right now I have it as a view but I don't care if it's a view or a function, I just need it to return a recordset to MS Access interface. 现在我把它作为一个视图,但我不在乎它是一个视图还是一个函数,我只需要它将记录集返回到MS Access接口。 The query takes 11 seconds to execute but with all of the cycles it goes through I need it down to 3 or less seconds. 查询需要11秒才能执行,但是通过它所经历的所有周期,我需要将其缩短到3秒或更短的时间。 I've tried to index the view I have now but unfortunately I can't use the AVG function or use a HAVING clause if I am going to index anything. 我试图索引我现在的视图,但不幸的是,如果我要索引任何东西,我不能使用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)

The following are the tables (I only included pseudo names for the columns referenced in the query and then fld1, fld2, fld3 for those that are irrelevant)... 以下是表格(我只包括查询中引用的列的伪名称,然后fld1,fld2,fld3用于那些不相关的列)...

tblAPL -- 4.5 million rows, clustered Index on fldLID 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 -- 12 million rows, clustered Index on fldDID 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 rows, clustered Index on fldUAID 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 rows, clustered Index on fldULID tblUL - 200,000行, fldULID聚簇索引

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

You can start by adding SET NOCOUNT ON; 您可以先添加SET NOCOUNT ON; This should speed it up quite a bit. 这应该会加快它的速度。

Have you tried changing your HAVING clause into a simple WHERE clause? 您是否尝试将HAVING子句更改为简单的WHERE子句? The only part you really can't move to a WHERE clause is the second line (the one with the AVG statement), right? 你真正无法移动到WHERE子句的唯一部分是第二行(带有AVG语句的那一行),对吗? This might speed it up since HAVING criteria are not evaluated until the entire resultset is generated. 这可能会加快速度,因为在生成整个结果集之前不会评估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)

Make an NON CLUSTERED INDEX over(fldCI) and (fldIG) Hopefully you have an index for all foreign keys. 创建一个非聚集索引(fldCI)和(fldIG)希望你有一个所有外键的索引。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM