7

クエリ実行プランアプリケーションの合計列で現在の合計を表示する必要があるため、次のクエリを使用して現在の合計を見つけました...両方が必要に応じて機能していることがわかります。1 つは group by で left join を使用し、もう 1 つは sub query を使用しました。

そして今、私の質問は、データが毎日数千単位で増加する場合にどちらが高速であり、データが1000行または2000行の制限にある場合、どちらが優れているかです...そして、これら2つよりも高速な他の方法はありますか?? ??

declare @tmp table(ind int identity(1,1),col1 int)
insert into @tmp
select 2
union
select 4
union
select 7
union 

select 5
union
select 8
union 
select 10



SELECT t1.col1,sum( t2.col1)
FROM @tmp AS t1 LEFT JOIN @tmp t2 ON t1.ind>=t2.ind
group by t1.ind,t1.col1


select t1.col1,(select sum(col1) from  @tmp as t2 where t2.ind<=t1.ind)
from @tmp as t1
4

3 に答える 3

4

再帰的な CTE の方が少し速いと思います。

;with C as
(
  select t.ind,
         t.col1,
         t.col1 as Total
  from @tmp as t
  where t.ind = 1
  union all
  select t.ind,
         t.col1,
         C.Total + t.col1 as Total
  from @tmp as t
    inner join C
      on C.ind + 1 = t.ind
)
select C.col1,
       C.Total
from C

より高速な他の方法

はいあります。優れたパフォーマンスを求めている場合は、単純な選択でデータを取得し、プレゼンテーションを行うときにクライアントで現在の合計計算を行う必要があります。

于 2011-09-13T05:29:08.903 に答える
0

あなたの質問はあまり正確ではありませんでした。そのため、回答すべきいくつかの一般的なルールを以下に示します。

  • インデックスを追加します。単純化しすぎたサンプルでは、​​col1 になります。
  • EXPLAINクエリを比較するために使用します。これにより、より大きなデータで何が起こるかについてのヒントが得られます。
  • (実際の) データでテストし、サーバーを最適化します。クエリ時間は多くのパラメーターに依存します。たとえば、データはサーバーのメモリに収まりますか? または、バッファーが十分に大きく構成されていますか?
  • キャッシュを使用して、DB サーバーからクエリを迂回させます。Memcached は、最も使用されているインメモリ アプリケーション レベルのキャッシュですが、他のキャッシュはあらゆるレベルに存在します。
于 2011-09-12T14:23:12.003 に答える