5

empno にクラスタ化された一意のインデックスを持つテーブル構造。

CREATE TABLE [dbo].[EMP](
    [EMPNO] [int] NOT NULL,
    [ENAME] [varchar](10) NULL,
    [JOB] [varchar](9) NULL,
    [MGR] [int] NULL,
    [HIREDATE] [datetime] NULL,
    [SAL] [int] NULL,
    [COMM] [int] NULL,
    [DEPTNO] [int] NULL
) ON [PRIMARY]

クエリ

SELECT sal,sum(sal) over(PARTITION BY empno)
FROM emp

クエリ プラン

ここに画像の説明を入力

4

2 に答える 2

3

ウィンドウ化された集計を含むプランは、通常、共通のサブ式スプールを使用します。このタイプの計画の適切な記述は、ここにあるPartitioning and the Common Subexpression Spool です。

テーブルに次の行があるとします

CREATE TABLE [dbo].[EMP](
    [EMPNO] [int] NOT NULL,
    [SAL] [int] NULL) 

INSERT INTO [dbo].[EMP] 
VALUES (1,1),
       (1,2), 
       (1,3),
       (1,4), 
       (2,1),
       (2,2)

合計で 6 つの行があり、2 つの個別のEMPNO値があります。実際に出力された行数を示す実際の実行計画は次のとおりです。

ここに画像の説明を入力

プランの先頭にあるセグメント イテレータは、それを通過する行にフラグを追加し、それがいつ新しいパーティションの開始であるか (つまり、empno変更されたか) を示します。

すぐ左のスプール (プライマリ スプール) は、セグメント イテレータから一度に 1 行を取得し、それを tempdb の作業テーブルに挿入します。新しいグループが開始されたことを示すフラグを取得すると、ネストされたループ演算子の一番上の入力に行が返されます。

これにより、作業テーブル (計画の 2 次スプール) 内の行に対してストリーム集約が呼び出されますSUM([SAL])。作業テーブルは切り捨てられ、新しいグループの準備が整います。

1 次セグメント・スプールは、処理される最終グループを取得するためにダミー行を発行します。これが、発行される実際の行数が 3 (グループ数 + 1) として表示される理由です。

于 2013-04-14T08:26:18.820 に答える