0

さまざまな州で使用されるアプリケーションのレポートをいくつか作成しています。データベースは非常に大きくなる可能性があります。列の合計を取得するための最良の方法を知りたいのですが。

現在、次のようなSQLがあります。

SELECT count(case when prg.prefix_id = 1 then iss.id end) +
       count(case when prg.prefix_id = 2 then iss.id end) as total,
       count(case when prg.prefix_id = 1 then iss.id end) as c1,
       count(case when prg.prefix_id = 2 then iss.id end) as c2
FROM dbo.TableName
WHERE ...

ご覧のとおり、列は2回あります。1つの例では、それらを追加して合計を表示し、もう1つの例では、レポートに必要な個々の値を表示します。

これはSQLの非常に小さなサンプルであり、20以上の列があり、それらの列のうち4つ以上が時々合計されます。

いくつかの@Parametersを宣言し、各列を@Parameterに等しく設定することを考えていたので、列の合計を表示するために必要な@Parametersを合計することができます。IE:SET @Total = @c1 + @c2

しかし、SQL Serverエンジンは、そのように列が複数回存在することさえ気にしますか?これを行うためのより良い方法はありますか?

4

2 に答える 2

2

これが行われない理由

select prg.prefix_id, count(1) from tablename where... group by prg.prefix_id     

prefix_idの結果セットと各prefix_IDの行数が残ります...一連のcount(case)ステートメントよりも優先される可能性があり、より高速であると思いますが、確認できませんもちろん。

@varsに頼る前に、サブクエリを使用します。このようなもの:

   select c1,c2,c1+c1 as total from 
   (SELECT 
   count(case when prg.prefix_id = 1 then iss.id end) as c1, 
   count(case when prg.prefix_id = 2 then iss.id end) as c2 
   FROM dbo.TableName 
   WHERE ... ) a
于 2010-10-13T15:58:55.727 に答える
1

T-SQLプロシージャロジックを使用する前に、可能であればストレートSQLを使用してください。SQLで実行できる場合は、経験則でSQLで実行してください。ストレートSQLで静的な値をエミュレートする場合は、次のようなインラインビューを試してください。

SELECT iv1.c1 + iv1.c2 as total,
       iv1.c1,
       iv1.c2
    FROM
    (
    SELECT count(case when prg.prefix_id = 1 then iss.id end) as c1,
           count(case when prg.prefix_id = 2 then iss.id end) as c2
    FROM dbo.TableName
    WHERE ...
    ) AS iv1

このようにして、論理的に1回カウントを取得し、それらのカウントに基づいて値を計算できます。ただし、SQL Serverは、カウントn回スキャンする必要がないほど賢いと思います。そのため、送信したSQLや使用しているSQLと計画が異なるかどうかはわかりません。

于 2010-10-13T15:58:25.353 に答える