Eu tenho a mesma consulta que mostra como sendo executada no modo de lote quando executada como uma instrução de seleção, mas no modo de linha quando a mesma consulta é a parte selecionada de uma operação CTAS. Ambas as tabelas (mais a tabela resultante) são todas alinhadas à distribuição.
Por que é isso? Obviamente, eu gostaria que ele fosse executado em modo de lote, se possível.
Causa a execução do modo de linha:
create table mytable1
with
(
distribution = hash(c1)
)
as
consulta:
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
A execução de explicação na consulta mostrou que algo abaixo estava definindo
MAXDOP
como1
.Forçar a consulta a usar 0 superou isso, pois os columnstores exigem DOP >= 2
Portanto, adicionar a dica abaixo ativa o modo em lote
Não entendo por que isso está acontecendo - meu entendimento é que o CTAS e a criação de um novo columnstore devem sempre ser paralelos, mas isso resolve o problema.
Editar: essa parece ser a configuração padrão, pois visa a melhor qualidade ideal do columnstore. Portanto, você deve escolher entre desempenho de leitura e qualidade de índice ou usar um armazenamento intermediário, com cada consulta tendo uma dica de maxdop diferente.