2017-02-01 8 views
0

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秒で結果セットを得ることを期待しています。

私はテーブル内の任意の変更を加えることができ、挿入操作に当たっていない限り、任意のインデックスを追加できます。

誰でも私に何か入力を促すことができますか?

+0

クエリ中にメモリ、CPU、ディスクIOをベンチマークしてみましたか?あなたがRAIDのSSDを持っていないかぎり、毎秒500行で3行分の行を要求すると、3秒間は非常に楽観的です。 – Martheen

答えて

0

あなたが頻繁にDate_Timeでソート(というよりもWHERE句でDate_Timeを使用して)しているので、私はあなたのインデックスからDate_Timeを削除したいだけDate_Timeに別のインデックスを作成します。あなたが頻繁にCol5を通じてCol1を取得しているように見えるので、

また、それは、に良いアイデアかもしれませんあなたの主な指標でそれらの列が含まれます。

だから私はこの試してみた:だから

CREATE INDEX MainIndex 
ON dbo.YourTable (CID, PID, DID, MID) 
INCLUDE (Col1, Col2, Col3, Col4, Col5) 

CREATE INDEX DateIndex 
ON dbo.YourTable (Date_Time) 

を:

  • FIRST、あなたの現在のパフォーマンス
  • を測定THEN変更
  • は再びパフォーマンスを測定します何か改善があるかどうかを確認します。そうであれば、新しいインデックスを保持し、
+0

col1からcol5は実際に頻繁に取得されません。ですから、ある時点ではCol1のみであり、ある時点ではcol1からcol 32までの任意の組み合わせである可能性があります。 –

+0

@HarshalSam:** IF **他のものよりも頻繁にフェッチされる列のセットを持っています。 *インデックスに列*を含めます。より頻繁に他のものよりも使用されているセットを特定できない場合は、実行しないでください –

関連する問題