4

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-- 1,200 万行、クラスタ化インデックスがオン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
4

3 に答える 3

0

SET NOCOUNT ON を追加することから始めることができます。これでかなりスピードアップするはずです。

于 2013-10-20T23:29:43.663 に答える
0

HAVING 句を単純な WHERE 句に変更してみましたか? WHERE 句に実際に移動できない唯一の部分は、2 行目 (AVG ステートメントのある行) ですよね? 結果セット全体が生成されるまで HAVING 基準が評価されないため、これにより速度が向上する可能性があります。

于 2014-02-03T21:48:55.197 に答える