2012-10-23 20 views
7

私は、10億行を少し上回るテーブルを持っていますが、それは素晴らしい挿入パフォーマンスを備えていますが、時にはひどい選択パフォーマンスです。 (PK示すように順序付けられている)SQL Server:時系列データのパフォーマンス

tblTrendDetails:テーブルには、継続的に新しいデータで引っ張って、古いデータを消去するので、挿入および削除され

PK TrendTime datetime 
PK CavityId  int 
PK TrendValueId int 
    TrendValue real 

パフォーマンスがてきぱきままにする必要があります。

、以下、性能が悪い(30秒)としてクエリ実行:私は(同様の時間で、任意@inCavityId又は@inTrendId)再度同じクエリを実行すると、パフォーマンスが非常にある

SELECT * 
FROM tblTrendDetails 
WHERE TrendTime BETWEEN @inMinTime AND @inMaxTime 
    AND CavityId = @inCavityId 
    AND TrendValueId = @inTrendId 

を良い(1秒)。パフォーマンスカウンタは、ディスクアクセスが最初にクエリが実行されたときの原因であることを示しています。

挿入または削除のパフォーマンスに(著しく)悪影響を及ぼすことなくパフォーマンスを向上させる方法に関する推奨事項はありますか?任意の提案(基礎となるデータベースを完全に変更することを含む)は歓迎されます。

+1

PKはクラスタ化されていますか?すべてのインデックス? –

+1

@TimLehnerはい.. PKがクラスタ化されています。いいえ(他の)インデックス。 – pilotcam

答えて

6

同じまたは類似のデータの後続のクエリがはるかに高速に実行されるという事実は、おそらくSQL Server caching your dataが原因です。つまり、この最初のクエリを高速化することは可能ですか?

は、クエリプランを確認します。

私の推測では、クエリではなくインデックススキャン(または悪化し、表スキャン)よりもシークインデックスを生じるはずであるということです。 SET SHOWPLAN_TEXT ON;または類似の機能を使用して確認してください。クエリとしてbetween=を使用すると、実際にはtake advantage of the clustered indexとなりますが、that's debatableです。

インデックスの断片化:

あなたのクラスタ化インデックス(この場合は主キー)は、これらの挿入と削除のすべての後、非常に断片化されている可能性があります。私はおそらくDBCC SHOWCONTIG (tblTrendDetails)とこれをチェックするでしょう。

DBCC INDEXDEFRAG (MyDatabase, tblTrendDetails)でテーブルのインデックスを最適化することができます。 これには時間がかかることがありますが、テーブルへのアクセスが可能になり、厄介な副作用なしに操作を停止できます。

さらに進んでDBCC DBREINDEX (tblTrendDetails)を使用する必要があります。ただし、これはオフライン操作です。したがって、テーブルにアクセスする必要がない場合にのみ実行してください。

ここには、Microsoft SQL Server 2000 Index Defragmentation Best Practicesの違いがいくつか記載されています。

大きなテーブルのデフラグからトランザクションログがかなり大きくなり、時間がかかることに注意してください。

分割ビュー:

これらの状況を改善していない(または断片化が問題ではありません)場合は、あなたも、partitioned viewsに見えるしたい場合がありますが、様々の基礎となるベーステーブルの束を作成しますレコードの範囲、それらのすべてのビュー(元のテーブルを置き換える)で結合します。

良いスタッフ:

これらの選択のパフォーマンスは、実際のビジネスニーズである場合、あなたはより良いハードウェアのためのケースを作ることができる可能性がありますなどより速くドライブ、より多くのメモリ、あなたのドライブが二倍であれば高速ですが、このクエリは半分の時間で実行されます。また、これは実用的ではないかもしれませんが、SQL Serverの新しいバージョンが見つかっただけで、より多くのオプションを使用してより速くなり、メンテナンス性が向上しました。私の会社のデータのほとんどを2008R2に移行してうれしいです。しかし、私は逃げます...

+2

+1非常に徹底的で明確な答えです。質問を投稿する前にクエリプランを確認しました。しかし、私はインデックスの断片化については考えていませんでした。 'SHOWCONTIG'は確かに断片化を明らかにした。私は今 'INDEXDEFRAG'を実行しています。 – pilotcam

関連する問題