SQL Server Expressエディションを使用していて、毎分500〜600行が挿入されているテーブルがあります。選択クエリおよび集計関数のSQL Serverパフォーマンスの向上
表スキーマには更新と既存の行の無削除は時間の任意の時点で関与していない新しい行の挿入のみがあります注意してくださいこの
ColumnName DataType
CID varchar(6)
PID varchar(6)
DID varchar(6)
MID byte
Date_Time DateTime
Col1 Decimal(19,6)
Col2 Decimal(19,6)
Col3 Decimal(19,6)
.
.
Col32 Decimal(19,6)
のようなものです。テーブルは膨大な速度で成長し続けます(SQL Server Expressエディションを使用しているので、データベースサイズが10 GBに達するまで拡大します)。
同時に、select文を使用してテーブルを取得し、Cid、PID、DID、MID、Date_timeに基づくフィルタリングを使用してCol1、Col2 .. Col32のいずれかの列に対して集計関数を取得します。
は現在組み合わせる非クラスタ化インデックスは、私は頻繁に、私は、インデックス内の同じ含まれ、私はマークパフォーマンスの向上までを取得する場合Col1
をフェッチしない場合のは、言ってみましょう
(CID, PID, DID, MID, Date_Time)
として設定されています。しかし、私はすべての32列(Col1, Col2.. Col32
)をインデックスに含めると良い方法ではないと思います。
マイ問合せパターンはSTARTDATEと終了日の間の差は3ヶ月以上のものとすることができる場所を以下のようにしているので、私は、サーバーが以下の結果セットを返すために大量のデータを考慮しなければならない
Select top(1)
from table
where Date_time between <startdate> and <endate>
and CID = ‘@cid
and PID = ‘@pid’
and DID = ‘@did’
and MID = ‘@mdi’
Select top(1) Col1, Col2
from table
where Date_time between <startdate> and <endate>
and CID = ‘@cid
and PID = ‘@pid’
and DID = ‘@did’
and MID = ‘@mdi’
order by Date_Time desc
Select top(1) Col1, Col2
from table
where Date_time between <startdate> and <endate>
and CID = ‘@cid
and PID = ‘@pid’
and DID = ‘@did’
and MID = ‘@mdi’
order by Date_Time asc
Select Col1, Col2, Col3, Col4, Col5
from table
where Date_time between <startdate> and <endate>
and CID = ‘@cid
and PID = ‘@pid’
and DID = ‘@did’
and MID = ‘@mdi’
order by Date_Time desc
Select Min(Col1), Max(Col2), Avg(Col3)
from table
where Date_time between <startdate> and <endate>
and CID = ‘@cid
and PID = ‘@pid’
and DID = ‘@did’
and MID = ‘@mdi’
を照会信じます
私はこのようなクエリパターンのパフォーマンスを改善し、最大で2〜3秒で結果セットを得ることを期待しています。
私はテーブル内の任意の変更を加えることができ、挿入操作に当たっていない限り、任意のインデックスを追加できます。
誰でも私に何か入力を促すことができますか?
クエリ中にメモリ、CPU、ディスクIOをベンチマークしてみましたか?あなたがRAIDのSSDを持っていないかぎり、毎秒500行で3行分の行を要求すると、3秒間は非常に楽観的です。 – Martheen