10

いくつかのクエリのパフォーマンスを改善しようとしています。クエリの構造は次のとおりです。

select 'Total_amount', 
(select SUM(Total) from dbo.Invoices i where i.BU = bun.BU), 
case when (select SUM(Total) from dbo.Invoices i where i.BU = bun.BU) > 100000 then 'Good' else 'Not good' end 
from dbo.BusinessUnits bun

この例は結合を使用して解決できることはわかっていますが、実際のクエリではサブクエリが必要です。お気づきかもしれませんが、同じサブクエリを 2 回使用しています。1 回目は実際の値を指定し、もう 1 回はステータスを計算します。

サブクエリを一度計算するだけでパフォーマンスを向上させる方法はありますか?

4

2 に答える 2

8

次のようにOUTER APPLYを使用してみてください:-

select 'Total_amount', SumTotal, case when SumTotal > 100000 
then 'Good' else 'Not good' end 
from dbo.BusinessUnits bun 
OUTER APPLY (select SUM(Total) 
from dbo.Invoices i where i.BU = bun.BU) CA(SumTotal)

それを指摘してくれたMARTIN SMITHに特に感謝します!!

于 2013-09-20T15:22:30.470 に答える
1

WITH を使用した別のオプション

WITH total_table( 'Total_amount' )
AS
( SELECT SUM(Total) 
  FROM Invoices INNER JOIN  BusinessUnits ON (Invoices.BU = BusinessUnits.BU )
)

SELECT
   CASE WHEN Total_amount > 100000 then 'Good'
   ELSE 'Not good' 
   END
FROM
   total_table
于 2013-09-20T15:27:55.593 に答える