1

次のフィールドを持つテーブルTheTableでSQLServerクエリを実行する最速の方法について質問があります。TimeStamp、Col1、Col2、Col3、Col4
データベースを管理していません。データベースにアクセスできます。次のような10個の計算を実行する必要があります。

Col2*Col3 + 5       
5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)       

次に、選択した日のデータを使用して、計算結果のAVGとMAXを見つける必要があります(これまでのところ、データベースには8か月のデータがあります)。データは0.1秒ごとにサンプリングされるため、864000行が各計算に入ります。クエリができるだけ早く実行されるようにしたいと思います。これよりも良い方法はありますか?

SELECT AVG(Col2*Col3 + 5), 
    AVG(5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)), 
    MAX(Col2*Col3 + 5), 
    MAX(5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)) 
FROM TheTable 
WHERE TimeStamp >= '2010-08-31 00:00:00:000' 
    AND TimeStamp < '2010-09-01 00:00:00:000'

ありがとう!

4

3 に答える 3

2

それらを計算された(計算された)列として作成Is Persistedし、trueに設定することができます。これにより、計算された値が挿入時にディスクに保持され、それらの値に対する後続のクエリが非常に高速になります。

または、テーブルスキーマを変更できない場合は、値を計算するインデックス付きビューを作成できます。

于 2010-09-20T16:56:05.193 に答える
0

データを選択するときではなく、データを挿入するときにこれらの計算を行うのはどうですか?次に、それらの値に対して特定の日の計算を行うだけで済みます。

TableName
---------
 TimeStamp
 Col1
 Col2
 Col3
 Col4
 Calc1
 Calc2
 Calc3

そしてそのように挿入します:

INSERT INTO TableName (...)
VALUES
(...,AVG(@Col2Val*@Col3Val + 5),...)
于 2010-09-20T16:53:43.543 に答える
0

あなたの唯一の賭けは、計算列またはビュー内の永続列のいずれかで、事前に値を計算することです。こちらの「SQL Server 2005 インデックス付きビューによるパフォーマンスの改善」を参照してください。データベースを変更できない場合は、そのデータベースからデータを独自のデータベースにプルできます。独自のデータベースに挿入するときに列を計算するだけです。次に、独自のデータベースからクエリを実行します。

于 2010-09-20T17:12:28.170 に答える