MSDNによると、
テーブル スプール オペレーターは、入力をスキャンし、非表示のスプール テーブルに各行のコピーを配置します。非表示のスプール テーブルは、tempdb データベースに格納され、クエリの有効期間だけ存在します。
まず、このステップの前に計画にインプットがありません... このテキストは、そうすべきであることを示しており、オンラインの他のリソースも同様に述べています。
スプール演算子は、常に別の演算子と一緒に使用されます。値を格納するとき、これらの値が何であるかを知る必要があるため、別のオペレーターから値を受け取る必要があります。
2 つ目は、ホバー オーバーの出力リストに複数のテーブルが含まれている場合です。それらはすべて個々のテーブルにスプールされていますか? もしそうなら、なぜ複数のステップを表示しないのですか? それらがすべて 1 つのテーブルにスプールされている場合、それらはスプールの前に結合されていますか? 必要に応じて、テーブルから「平坦化」します。
3 番目に、以下で説明するように、1 と 2 の答えがあると思いますが、元のステップのコスト % が 0% であり、そのスプールが別のブランチで再利用されるとコスト % が 12% になることがわかります。それを読み返すと、元の書き出すよりもコストがかかるのはなぜですか?
編集:テキストプラン
StmtText
|--Compute Scalar(DEFINE:([so].[SLS_ORG_OPR_UNT_SRC_KEY]=[Expr1021], [so].[SLS_ORG_PROD_SRC_KEY]=[Expr1022], [cal].[WEEK_END_DATE]=[Expr1023], [so].[SLS_ORG_EMPL_SRC_KEY]=[Expr1024], [so].[SLS_ORG_JOBCODE]=[Expr1025]))
|--Hash Match(Inner Join, HASH:([Expr1021], [Expr1022], [Expr1023], [Expr1024], [Expr1025])=([Expr1016], [Expr1017], [Expr1018], [Expr1019], [Expr1020]), RESIDUAL:([Expr1016] = [Expr1021] AND [Expr1017] = [Expr1022] AND [Expr1018] = [Expr1023] AND [Expr1019] = [Expr1024] AND [Expr1020] = [Expr1025]))
|--Compute Scalar(DEFINE:([Expr1021]=[DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_OPR_UNT_SRC_KEY] as [so].[SLS_ORG_OPR_UNT_SRC_KEY], [Expr1022]=[DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_PROD_SRC_KEY] as [so].[SLS_ORG_PROD_SRC_KEY], [Expr1023]=[DMRPT].[dbo].[DIM_CALENDAR].[WEEK_END_DATE] as [cal].[WEEK_END_DATE], [Expr1024]=[DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_EMPL_SRC_KEY] as [so].[SLS_ORG_EMPL_SRC_KEY], [Expr1025]=[DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_JOBCODE] as [so].[SLS_ORG_JOBCODE]))
| |--Compute Scalar(DEFINE:([Expr1011]=CONVERT_IMPLICIT(int,[Expr1059],0)))
| |--Stream Aggregate(GROUP BY:([so].[SLS_ORG_OPR_UNT_SRC_KEY], [so].[SLS_ORG_PROD_SRC_KEY], [cal].[WEEK_END_DATE], [so].[SLS_ORG_EMPL_SRC_KEY], [so].[SLS_ORG_JOBCODE]) DEFINE:([Expr1059]=COUNT([Expr1015])))
| |--Sort(DISTINCT ORDER BY:([so].[SLS_ORG_OPR_UNT_SRC_KEY] ASC, [so].[SLS_ORG_PROD_SRC_KEY] ASC, [cal].[WEEK_END_DATE] ASC, [so].[SLS_ORG_EMPL_SRC_KEY] ASC, [so].[SLS_ORG_JOBCODE] ASC, [Expr1015] ASC))
| |--Table Spool
| |--Compute Scalar(DEFINE:([Expr1015]=[Expr1013]+[Expr1014]))
| |--Hash Match(Inner Join, HASH:([so].[SLS_ORG_GK])=([f].[SLS_ORG_GK]), RESIDUAL:([DMRPT].[dbo].[FACT_PRODUCER_SPREAD_HOURS].[SLS_ORG_GK] as [f].[SLS_ORG_GK]=[DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_GK] as [so].[SLS_ORG_GK]))
| |--Clustered Index Scan(OBJECT:([DMRPT].[dbo].[DIM_SALES_ORG].[SYS_SLS_ORG_GK] AS [so]))
| |--Hash Match(Inner Join, HASH:([c].[CONTR_GK])=([f].[CONTR_GK]), RESIDUAL:([DMRPT].[dbo].[FACT_PRODUCER_SPREAD_HOURS].[CONTR_GK] as [f].[CONTR_GK]=[DMRPT].[dbo].[DIM_CONTRACTOR].[CONTR_GK] as [c].[CONTR_GK]))
| |--Compute Scalar(DEFINE:([Expr1014]=CONVERT_IMPLICIT(numeric(38,0),[DMRPT].[dbo].[DIM_CONTRACTOR].[CONTR_SRC_KEY] as [c].[CONTR_SRC_KEY],0)))
| | |--Index Scan(OBJECT:([DMRPT].[dbo].[DIM_CONTRACTOR].[nc_csk] AS [c]))
| |--Hash Match(Inner Join, HASH:([r].[REQ_POS_GK])=([f].[REQ_POS_GK]), RESIDUAL:([DMRPT].[dbo].[FACT_PRODUCER_SPREAD_HOURS].[REQ_POS_GK] as [f].[REQ_POS_GK]=[DMRPT].[dbo].[DIM_REQUISITION_POS].[REQ_POS_GK] as [r].[REQ_POS_GK]))
| |--Compute Scalar(DEFINE:([Expr1013]=CONVERT_IMPLICIT(numeric(38,0),[DMRPT].[dbo].[DIM_REQUISITION_POS].[REQ_POS_JOB_REQ_SRC_KEY] as [r].[REQ_POS_JOB_REQ_SRC_KEY],0)+[DMRPT].[dbo].[DIM_REQUISITION_POS].[REQ_POS_POSITION_NO] as [r].[REQ_POS_POSITION_NO]))
| | |--Clustered Index Scan(OBJECT:([DMRPT].[dbo].[DIM_REQUISITION_POS].[SYS_C00600262] AS [r]))
| |--Hash Match(Inner Join, HASH:([cal].[DATE_GK])=([f].[WEEK_END_DATE_GK]), RESIDUAL:([DMRPT].[dbo].[FACT_PRODUCER_SPREAD_HOURS].[WEEK_END_DATE_GK] as [f].[WEEK_END_DATE_GK]=[DMRPT].[dbo].[DIM_CALENDAR].[DATE_GK] as [cal].[DATE_GK]))
| |--Clustered Index Scan(OBJECT:([DMRPT].[dbo].[DIM_CALENDAR].[SYS_C00599872] AS [cal]), WHERE:([DMRPT].[dbo].[DIM_CALENDAR].[FULL_DATE] as [cal].[FULL_DATE]>=getdate()-'1900-01-31 00:00:00.000'))
| |--Clustered Index Scan(OBJECT:([DMRPT].[dbo].[FACT_PRODUCER_SPREAD_HOURS].[PK_FCT_PRDCR_SPRD_HRS] AS [f]))
|--Compute Scalar(DEFINE:([Expr1016]=[DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_OPR_UNT_SRC_KEY] as [so].[SLS_ORG_OPR_UNT_SRC_KEY], [Expr1017]=[DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_PROD_SRC_KEY] as [so].[SLS_ORG_PROD_SRC_KEY], [Expr1018]=[DMRPT].[dbo].[DIM_CALENDAR].[WEEK_END_DATE] as [cal].[WEEK_END_DATE], [Expr1019]=[DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_EMPL_SRC_KEY] as [so].[SLS_ORG_EMPL_SRC_KEY], [Expr1020]=[DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_JOBCODE] as [so].[SLS_ORG_JOBCODE]))
|--Hash Match(Aggregate, HASH:([so].[SLS_ORG_OPR_UNT_SRC_KEY], [so].[SLS_ORG_PROD_SRC_KEY], [cal].[WEEK_END_DATE], [so].[SLS_ORG_EMPL_SRC_KEY], [so].[SLS_ORG_JOBCODE]), RESIDUAL:([DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_OPR_UNT_SRC_KEY] as [so].[SLS_ORG_OPR_UNT_SRC_KEY] = [DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_OPR_UNT_SRC_KEY] as [so].[SLS_ORG_OPR_UNT_SRC_KEY] AND [DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_PROD_SRC_KEY] as [so].[SLS_ORG_PROD_SRC_KEY] = [DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_PROD_SRC_KEY] as [so].[SLS_ORG_PROD_SRC_KEY] AND [DMRPT].[dbo].[DIM_CALENDAR].[WEEK_END_DATE] as [cal].[WEEK_END_DATE] = [DMRPT].[dbo].[DIM_CALENDAR].[WEEK_END_DATE] as [cal].[WEEK_END_DATE] AND [DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_EMPL_SRC_KEY] as [so].[SLS_ORG_EMPL_SRC_KEY] = [DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_EMPL_SRC_KEY] as [so].[SLS_ORG_EMPL_SRC_KEY] AND [DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_JOBCODE] as [so].[SLS_ORG_JOBCODE] = [DMRPT].[dbo].[DIM_SALES_ORG].[SLS_ORG_JOBCODE] as [so].[SLS_ORG_JOBCODE]) DEFINE:([Expr1010]=SUM([DMRPT].[dbo].[FACT_PRODUCER_SPREAD_HOURS].[SPREAD_LCL] as [f].[SPREAD_LCL])))
|--Table Spool