Banco de Dados SQL do Azure - Standard Edition (camada de serviço S3)
Por que o modo de lote só entra em vigor ao usar funções agregadas?
DROP TABLE IF EXISTS dbo.TransCS
CREATE TABLE dbo.TransCS (
Col1 INT
,Col2 AS Col1*2
)
CREATE CLUSTERED COLUMNSTORE INDEX CS_TransCS on dbo.TransCS;
WITH
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
L4 AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
L5 AS(SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
AS n FROM L5)
INSERT INTO dbo.TransCS (Col1)
SELECT TOP (1000000) n FROM Nums ORDER BY n;
Inserir 1 milhão de linhas
Processamento de linha
SELECT * FROM dbo.TransCS
Processamento em lote
SELECT Col1, Col2, SUM(Col2)OVER ()
FROM dbo.TransCS
Existe uma maneira de utilizar os benefícios de desempenho sem usar as funções Agg? A documentação sobre isso é escassa.
Fundo
Em julho de 2017, Niko blogou sobre uma mudança no SQL Server 2017
Antes disso, você obteria execução em modo de linha para "planos triviais", mesmo quando houvesse objetos columnstore envolvidos.
O plano de execução que você compartilhou mostra que a primeira consulta tem esse problema, que você pode confirmar no XML:
Gambiarra
Uma maneira de contornar isso, obter a otimização COMPLETA e, assim, obter uma verificação no modo de lote, é adicionar uma subconsulta que não afetará seus resultados, assim:
A segunda consulta já obtém otimização completa por causa da função agregada.
Por que isso está acontecendo?
As únicas coisas que vêm à mente sobre por que isso pode acontecer são:
15.0.1100.504
, que se parece com um número de compilação do SQL Server 2019 (o que faz sentido, pois é o Azure). Não tenho uma instância de 2019 para testar, mas a mudança de comportamento também pode estar láVocê pode relatar isso à Microsoft em site de comentários .