1

WHERE フィルターに基づいてこのクエリを最適化する方法はありますか? 互換性の理由から、計算列を使用できません。それ以外に、私はどんな提案も受け入れます:

UPDATE #ATempTable
   SET SomeTotal = (QuantityA + QuantityB + QuantityC) 
 - (dbo.fmin(dbo.fmax(ISNULL(ValueA,0)
  ,dbo.fmax(ISNULL(ROUND(ValueB,0),0)
 , ISNULL(ValueC,0))), ISNULL(round(ValueD,0), 9999999)))

 WHERE QuantityA + QuantityB + QuantityC > 
 (dbo.fmin(dbo.fmax(ISNULL(ValueA,0)
  ,dbo.fmax(ISNULL(ROUND(ValueB,0),0)
 , ISNULL(ValueC,0))), ISNULL(round(ValueD,0), 9999999)))

SQL Server 2008 R2 を使用しています。fmaxfminは、指定された 2 つの値の最大値と最小値をそれぞれ返すユーザー定義関数であり、スキーマにバインドされていません。

編集:追加情報

#ATempTable は、アプリケーションによって呼び出されるプロシージャ内の一時テーブルです。SomeTotal、QuantityA/B/C、および ValueA/B/C/D はすべて、そのテーブルのフィールドです。いいえ、コードはそのようではありません。フィールドの名前を変更しました。

4

2 に答える 2

2

SQL Server 2008 R2 は、インデックス付きビューをサポートしています。ベース テーブルにビューを作成し、そこに集計列を定義してから、その上にインデックスを作成することができます。これにより、フィルタリング時間が大幅に短縮されます。

于 2013-04-23T16:12:37.690 に答える
0

whereテーブルを作成するときは、句に違いがある列を追加することをお勧めします。

diff = (QuantityA + QuantityB + QuantityC) -
 (dbo.fmin(dbo.fmax(ISNULL(ValueA,0)
  ,dbo.fmax(ISNULL(ROUND(ValueB,0),0)
 , ISNULL(ValueC,0))), ISNULL(round(ValueD,0), 9999999)));

次に、新しい列にインデックスを追加できます (これを と呼びdiffます)。updateこれにより、ステートメントが高速化されます。

于 2013-04-23T17:39:46.637 に答える