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