2

次の挿入クエリは、実行に 7 秒かかります。ループ内で複数回実行されるため、時間が加算されます。コストの 90% はクラスター化インデックスの挿入に、10% は FN_qryPSLA() のテーブル スキャンに費やされます。

INSERT INTO tblTPS (fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA, fldBA)
SELECT fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA, 1 AS fldBA
FROM FN_qryPSLA()
WHERE (((fldPK)= 37923 ) AND ((fldMN)<>-254));

以下は FN_qryPSLA() です... Distinct Sort のコストは 85% です (削除された場合、コストは 80% のハッシュ一致 (集計) です)

FUNCTION [dbo].[FN_qryPSLA](@PK INT)
RETURNS @tmpTblPSLA TABLE (
fldPK       BIGINT      NOT NULL,           
fldDTA          DATETIME    NULL,
fldCI       FLOAT       NULL,   
fldMN       FLOAT       NULL,
fldMDN      FLOAT       NULL,
fldIQ       FLOAT       NULL,               
fldSD       FLOAT       NULL,
fldNDS      BIGINT      NULL,
fldNIN      BIGINT      NULL,
fldNL       BIGINT      NULL,
fldMin      FLOAT       NULL,
fldMax      FLOAT       NULL,
fldUNC      VARCHAR(5)  NULL, 
fldAVA      TINYINT     NULL
) 
AS
BEGIN 
WITH gDPS AS 
(SELECT fldPK, Max(fldDTA) AS fldDTA
FROM tblAPS
GROUP BY fldPK)

    SELECT fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA
FROM tblAPS INNER JOIN getDPS ON (tblAPS.fldDTA = gDPS.fldDTA) AND (tblAPS.fldPK = gDPS.fldPK)
    GROUP BY fldPK, fldDTA, fldCI, fldMN, fldMDN, fldIQ, fldSD, fldNDS, fldNIN, fldNL, fldMin, fldMax, fldUNC, fldAVA
    HAVING tblAPS.fldMN<>-254
    ORDER BY tblAPS.fldPK, tblAPS.fldCI;
    RETURN; 
END;

関連するフィールド (クエリ対象のテーブル内の 200 万レコード) fldPSD のクラスター化インデックス...

fldPK           BIGINT      NOT NULL,           
fldDTA  DATETIME    NULL,
fldCI       FLOAT       NULL,   
fldMN           FLOAT       NULL,
fldMDN          FLOAT       NULL,
fldIQ               FLOAT       NULL,               
fldSD               FLOAT       NULL,
fldNDS      BIGINT      NULL,
fldNIN          BIGINT      NULL,
fldNL           BIGINT      NULL,
fldMin              FLOAT       NULL,
fldMax              FLOAT       NULL,
fldUNC      VARCHAR(5)  NULL, 
fldAVA      TINYINT     NULL
4

1 に答える 1

6

このスニペットは私にとって際立っていました:

コストの 90% はクラスター化インデックスの挿入に費やされます

それを念頭に置いて、試してみるべき2つのことを考えることができます。

  1. ターゲット テーブルのFILL FACTORを変更して、受信データ用に各ページに空きスペースを許可します。
    または:
  2. 主キーの順序と一致するように、挿入前にデータを順序付けます。

これらの両方の目的は、挿入中にデータとインデックスを再ページングする必要性を減らすことです。

最初のケースでは、作成時に各ページに空きスペースを確保しているため、レコードを挿入するときに新しいページを頻繁に分割または作成する必要がありません。

2 番目のケースでは、挿入の一部である SELECT コマンドで ORDER BY を使用することはできませんが、その SELECT コマンドのテーブルのインデックスを通じて順序に影響を与えることができます。目標は、データを順番にフィードすることで、データを挿入しながら一度に 1 つのページで順番に作業できるようになることです。

于 2013-10-09T21:28:47.947 に答える