web-dev-qa-db-ja.com

selectはバッチモードで実行されますが、CTASは行モードで実行されます

Selectステートメントとして実行するとバッチモードで実行されているように見える同じクエリがありますが、同じクエリがCTAS操作の選択部分である場合は行モードです。両方のテーブル(および結果のテーブル)はすべて分布が揃えられています。

どうしてこれなの?もちろん、可能であればバッチモードで実行したいと思います。

行モードの実行を引き起こします:

create table mytable1
with
(
    distribution = hash(c1)
)
as

クエリ:

with  filterData as 
(
    select 
        a
        ,b
        ,c
        ,d
        ,DateStamp
    from [DW_reporting].[table1] 
    where num > 0
)

    select 
        p.[DateStamp]
        ,p.[a1]
        ,p.b1
        ,p.c1
        ,p.d1
        ,e.a
        ,e.b
        ,case when e.d is not null then 1 else 0 end as Flag
    from SOmeOtherTable p
    left join filterData e on e.a = p.a1
                                            and e.c = p.c1
                                            and e.DateStamp < p.DateStamp       
1
Neil P

クエリでexplainを実行すると、その下にあるものがMAXDOP1に設定していることがわかりました。

列ストアにはDOP> = 2が必要 のように、クエリに0を使用させることでこれを克服しました。

したがって、以下のヒントを追加すると、バッチモードが有効になります

    OPTION (MAXDOP 0)   

これが発生している理由がわかりません。CTASと新しい列ストアの構築は常に並行している必要があると理解していますが、これで問題は解決します。

編集:これは、最高の最適な列ストア品質を目指しているため、デフォルト設定のようです。したがって、読み取りパフォーマンスとインデックス品質のどちらかを選択するか、中間ストアを使用する必要があります。クエリごとに異なるmaxdopヒントがあります。

2
Neil P