Existem dois níveis de dobramento constante, um na árvore de conversão e outro na fase de simplificação?
Se eu executar a seguinte consulta
SELECT
P.[ProductID]
FROM
Production.Product AS P
WHERE
P.[ProductID] = 1 + 2 * 3
OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 8606, QUERYTRACEON 8607, QUERYTRACEON 3604);
Na árvore de conversão, encontro uma constante, então eu chamaria isso de dobramento de constante básica?
como Paul Holmes diz neste exemplo, mas se eu executar esta consulta de Paul White
use AdventureWorks2016
begin tran
SELECT
P.[Name]
FROM Production.Product AS P
WHERE
P.[Name] LIKE
SUBSTRING(LEFT(CHAR(ASCII(CHAR(68))), 1) + '%', 1, 2)
OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 8606, QUERYTRACEON 8607, QUERYTRACEON 3604);
commit tran
e
begin tran
SELECT
P.[Name]
FROM Production.Product AS P
WHERE
P.[Name] LIKE
'd%'
OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 8606, QUERYTRACEON 8607, QUERYTRACEON 3604);
commit tran
Não vejo muita diferença entre ambos em termos de árvores de conversão, então a dobra constante aconteceu aqui e suas árvores simplificadas têm os mesmos operadores?
Existem diferentes estágios no dobramento constante? Onde eles estão? O que eu fiz de errado aqui, então não vi na fase de simplificação?
O dobramento constante pode acontecer muitas vezes em diferentes estágios de otimização.
Ele é executado de forma abrangente em operadores escalares logo no início durante a algebrização . Não é possível ver a árvore bem impressa antes deste estágio nas versões atuais do SQL Server.
Ambos os exemplos na questão mostram o resultado dessa aplicação de dobramento constante. Um parece mais simples que o outro simplesmente porque resulta em um inteiro em vez de uma estrutura.
Meu exemplo é constantemente dobrado em uma
LikeRangeInfo
estrutura:Você pode usar
CHAR
ouNCHAR
para decodificar os números (resultados mostrados como comentários).O dobramento constante também é executado novamente mais tarde — em uma expressão específica — sempre que uma nova oportunidade de dobramento surgir como resultado da atividade do otimizador.
Algumas expressões que não podem ser totalmente dobradas de forma constante ainda podem estar sujeitas a alguma dobra durante a estimativa de cardinalidade .
Por exemplo, uma expressão que pode produzir um erro não é dobrada constantemente, mas ainda pode ser avaliada pelo mesmo mecanismo como parte da derivação de seletividade.