0

実行中の合計を計算して表示するためのより高速な方法が必要です。

これは、サブクエリを使用して実行中の合計を生成するビューをクエリする MVC テレリック グリッドです。クエリが完了するまでに 73 秒かかりますが、これは受け入れられません。(ユーザーが「Refresh Forecast Sheet」を押すたびに、グリッドを再設定するのに 73 秒かかります。)

クエリは次のようになります。

SELECT outside.EffectiveDate
[omitted for clarity]
       ,(
              SELECT SUM(b.Amount)
              FROM vCI_UNIONALL inside
              WHERE inside.EffectiveDate <= outside.EffectiveDate
              ) AS RunningBalance
[omitted for clarity]
FROM vCI_UNIONALL outside

特定のアイテムの「EffectiveDate」は常に変更される可能性があります...新しいアイテムが追加される可能性があります。確かに、実行中の合計をその場で計算できるものが必要です([更新]ボタンが押されたとき)。ストアド プロシージャまたは別のビュー...? お知らせ下さい。

解決策:(多くの1つ、これはサブクエリよりも桁違いに高速です)

colを除くRunningTotalビュー内のすべての列を含む新しいテーブルを作成します。最初にテーブルを切り捨て、次にすべての列INSERT INTOを使用してテーブルを切り捨てるストアド プロシージャを作成します。SELECT

ローカル変数の更新メソッドを使用します。

DECLARE @Amount DECIMAL(18,4)
SET @Amount = 0
UPDATE TABLE_YOU_JUST_CREATED SET RunningTotal = @Amount, @Amount = @Amount + ISNULL(Amount,0)

ストアド プロシージャを 1 日 1 回実行するタスク エージェントを作成します。TABLE_YOU_JUST_CREATEDすべてのレポートに を使用します。

4

1 に答える 1

1

この投稿を見てみましょう SQL Serverで実行中の合計を計算する

SQL Server Denali を使用している場合は、新しいウィンドウ関数を使用できます。

SQL Server 2008 R2 では、再帰的な共通テーブル式を使用することをお勧めします。CTE の小さな問題は、高速クエリの場合、ギャップ (1、2、3、...) のない ID 列が必要であり、そのような列がない場合は、そのような一時テーブルまたは変数テーブルを作成する必要があることです。列に移動し、そこにデータを移動します。

CTEアプローチは次のようになります

declare @Temp_Numbers (RowNum int, Amount <your type>, EffectiveDate datetime)

insert into @Temp_Numbers (RowNum, Amount, EffectiveDate)
select row_number() over (order by EffectiveDate), Amount, EffectiveDate
from vCI_UNIONALL

-- you can also use identity
-- declare @Temp_Numbers (RowNum int identity(1, 1), Amount <your type>, EffectiveDate datetime)
-- insert into @Temp_Numbers (Amount, EffectiveDate)
-- select Amount, EffectiveDate
-- from vCI_UNIONALL
-- order by EffectiveDate

;with 
CTE_RunningTotal
as
(
    select T.RowNum, T.EffectiveDate, T.Amount as Total_Amount
    from @Temp_Numbers as T
    where T.RowNum = 1
    union all
    select T.RowNum, T.EffectiveDate, T.Amount + C.Total_Amount as Total_Amount
    from CTE_RunningTotal as C
        inner join @Temp_Numbers as T on T.RowNum = C.RowNum + 1
)
select C.RowNum, C.EffectiveDate, C.Total_Amount
from CTE_RunningTotal as C
option (maxrecursion 0)

値が重複しているという質問があるかもしれません。EffectiveDateそれは、それらをどのように処理したいかによって異なります。

于 2012-12-08T17:10:43.347 に答える