2

300 件未満の結果を返す次のクエリがあります。現在、完了までに約 4 秒かかっています。実行計画を見ると、クラスター化インデックス スキャンに 41% のリソースが費やされていることがわかります。データベース管理に関する私の知識は限られているため、クラスター化されたインデックスのシークによってパフォーマンスが向上することが示唆されています。クラスター化インデックス スキャンの代わりにクラスター化インデックス シークを使用するクエリを取得するにはどうすればよいですか? 以下は、関連情報とクエリです。

  • Sql サーバー 2008 R2
  • テーブル PMDME は約 140,000 行 (これはリソースの 41% を占めている行です)
  • サーバー ハードウェア: 16 コア 2.7gz プロセッサ、48GB RAM
    DECLARE @開始日、@終了日
    SET @start = '2013-01-01'
    SET @end = CAST(GETDATE() AS DATE)
    選択する
        b.合計、    
        c.摂取量、
        d.船、
        a.CODE_、
        RTRIM(a.NAME_) を名前として、
        f. 営業担当者としての従業員、
        g.referral_type_id、
        h.referral_type、
        e.slscode、
        街、
        状態_、
        a.zip
    PACWARE.ADS.RFDME から
    左外部結合 (
        SELECT SUM(b.quantity) total, a.ref_id from event.dbo.sample a
        JOIN event.dbo.sample_parts b on a.id = b.sample_id
        b.part_id = c.CODE_ で PACWARE.ADS.PTDME c に参加
        WHERE c.MEDICAREID = 'E0607' AND @start と @end の間の a.order_date
        GROUP BY a.ref_id
    )b on a.CODE_ = b.ref_id
    左外部結合 (
        SELECT COUNT(a.CODE_) を取り込み、rfcode として
        FROM PACWARE.ADS.PMDME a
        WHERE a.REGDATETIME BETWEEN @start と @end
        GROUP BY a.RFCODE
    ) c on a.CODE_ = c.rfcode
    左外部結合 (
        選択する
        船として COUNT(a.CODE)、b.rfcode
        から
        (
            選択する
            A.コードとしてのアカウント、
            MIN(CAST(A.BILLDATETIME AS DATE)) AS SHIPDATE

            PACWARE.ADS.ARODME A から
            A.PTCODE=B.CODE_ の LEFT OUTER JOIN PACWARE.ADS.PTDME B
            LEFT OUTER JOIN event.dbo.newdate() D ON A.ACCOUNT=D.ACCOUNT
            LEFT OUTER JOIN event.dbo.newdate_extras() D2 ON A.ACCOUNT=D2.ACCOUNT
            WHERE A.BILLDATETIME>=@start
            AND A.BILLDATETIME=@start AND D.NEWDATE=@start AND D2.NEWDATE'ID'
            グループ化
            A.アカウント、
            B.MEDICAREID、
            A.カテゴリー
        )
        a.CODE = b.CODE_ で PACWARE.ADS.PMDME b に参加
        GROUP BY b.RFCODE
    ) d on a.CODE_ = d.rfcode
    LEFT OUTER JOIN event.dbo.employee_slscode e on a.SLSCODE = e.slscode
    JOIN event.dbo.employee f on e.employee_id = f.id
    JOIN event.dbo.referral_data g on a.CODE_ = g.CODE_
    JOIN event.dbo.referral_type h on g.referral_type_id = h.id
    WHERE 合計 > 0
4

1 に答える 1

2

テーブルの列のためだけに最初にインデックスを作成してみREGDATETIMEますPACWARE.ADS.PMDME

GO
CREATE NONCLUSTERED INDEX [IX_PMDME_REGDATETIME] ON PACWARE.ADS.PMDME
(
    [REGDATETIME] ASC
)
GO

それがどのように機能するかをテストします。列の選択性が十分でRFCODEあれば、列 (同じテーブル)に別のインデックスを追加することもテストします。

于 2013-01-30T19:44:36.643 に答える