2012-01-26 12 views
0

一時的なデータに対してシミュレーションを実行するアプリケーションがあります。計算はあまり複雑ではありませんが、計算には同じシミュレーションで以前に予測された時間的データが必要です。TSQLのカーソルとスカラー関数を置き換える方法

データポイントが15分間隔の1週間のデータを使用したシミュレーションを想定します。次のように予測値のために簡略化計算である:

PredictedValue = A + B + C + D 

B、C、及びDの値を取得するために、シミュレーションは、T0、T-1、T-95、T-96で以前に計算されたデータを必要とします、t-672およびt-673。これは、現在および前の間隔、前日の現在および前の間隔、および前の週の現在および前の間隔の時間的データである。

私は実時間でデータをシミュレートする実装を行っていますが、大規模なデータセットではパフォーマンスが極端に悪いです。

実装では、TSQLカーソルを使用して、シミュレーションおよびスカラー関数の時間データをループして、以前に計算されたデータを取得します。

基本的にデータセットが大きければ大きいほど、シミュレーションは遅くなります。たとえば、1日のデータを使用するシミュレーションでは、1分の時間が<になります。 1か月のデータを含むシミュレーションは2〜3日かかります。

カーソルやスカラー関数を使用せずにTSQLコードのパフォーマンスを向上させる方法は本当に興味があります。

+1

は、既存の実装にいくつかのコードを共有しています。カーソルの代わりにセットを使用して書き直すことができます –

+0

コードの一部を投稿できますか? – Beth

+0

日付/時刻に関するパフォーマンスの問題は、索引(またはその欠如)に関連し、WHERE句に不適切な機能を使用することが多いです。 DBエンジンがテーブルのすべての行に関数を適用するように強制するとします。 WHERE YEAR(DATE_COL)> 2000の場合、表が大きくなるとパフォーマンスが低下します。 – HABO

答えて

1

この場合、自己結合を使用することをお勧めします。 SQL Serverはクエリを処理してセットとして処理することで、大幅なスピードアップを実現します。

簡体例、テーブルをと仮定すると2列(日付、値)を有し、データ

SELECT (A.value + B.value) as Prediction 
FROM [Data] A left join [Data] B 
ON B.date = dateadd(day,-1, A.date) 

と呼ばれている( - しかし、私は、あなたが画像を取得願っていますテストを行わずに行うので、タイプミスのを含んでいてもよいです)。

幸運にも、オットー。

関連する問題