0

TSql マージ命令が何らかの理由で遅くなります。

バッチ サイズが 10000 レコードに等しいデータ バッチをバッチごとにマージすると、あるバッチから別のバッチへのマージに時間がかかることがわかります。

マージ命令は次のとおりです。

MERGE [dbo].[SResult] AS target
            USING [dbo].[SResultTemp] AS source 
            ON (target.QSId = source.QSId 
                and target.ResultId = source.ResultId 
                and target.EngineId = source.EngineId)  
            WHEN NOT MATCHED THEN INSERT 
                (QSId, ResultId, EngineId, Position) 
            values 
                (source.QSId, source.ResultId, source.EngineId, source.Position);

このように宣言されたソーステーブル

    CREATE TABLE [dbo].[SResultTemp](
        [QSId] int not null,
        [ResultId] int not null,
        [EngineId] int not null,
        [Position] int not null,
        CONSTRAINT [PK_SResultTemp] PRIMARY KEY CLUSTERED(
            [QSId], [ResultId], [EngineId], [Position] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        ) ON [PRIMARY]

ターゲットは同じですが、主キーとして追加のフィールド SResultId と別の一連のインデックスがあります。

PK_SResult - プライマリ

IX_SResult_QSId_ResultId - 非固有、非クラスター化

IX_SResult_EngineId - 非固有、非クラスター化

UX_SResult_EngineId_QSId_Position - 一意、クラスタ化されていない

ログに表示される内容は次のとおりです。

    Results Upload: SResult took 00:00:01.0008344 
    Results Upload: SResult took 00:00:18.1046734
    Results Upload: SResult took 00:00:17.9797846
    Results Upload: SResult took 00:00:27.7828817
    Results Upload: SResult took 00:01:30.4140091
    Results Upload: SResult took 00:03:17.6433416
    Results Upload: SResult took 00:03:21.3761251
    Results Upload: SResult took 00:06:07.2555342
    Results Upload: SResult took 00:06:56.2423653
    Results Upload: SResult took 00:06:57.1729179
    Results Upload: SResult took 00:07:09.7221083

また、私は複数のテーブルを扱っているので、他のテーブルではこのような規則性はありません。誰でも助けることができますか?

ありがとう!

4

3 に答える 3

1

インデックスがフラグメント化されると、挿入速度が低下します。
ご覧のとおり、急速に劣化する可能性があります。
PK の順に挿入できれば、断片化が減少します。
インデックスをパディングすると、断片化が遅くなります。
クラスター化されていないインデックスをすべて削除し、挿入が完了した後に再構築できますか?

SResultId は ID ですか?

なぜそのインデックスのデザインですか?
SResultTemp の PK とは異なる一意の制約があります。

インデックスは選択を高速化しますが、挿入と更新を遅くします。
結合のインデックスは役に立ちますが、現在そのインデックスは分割されています。

私のアドバイスは、一意性とテストに必要なインデックスのみに分割することです。

于 2013-08-21T14:01:02.307 に答える