Quando olho para o plano de exposição real de algumas de minhas consultas, percebo que as constantes literais usadas em uma cláusula WHERE aparecem como uma cadeia aninhada de cálculo de varredura escalar e constante .
Para reproduzir isso, eu uso a tabela a seguir
CREATE TABLE Table1 (
[col1] [bigint] NOT NULL,
[col2] [varchar](50) NULL,
[col3] [char](200) NULL
)
CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC)
Com alguns dados:
INSERT INTO Table1(col1) VALUES (1),(2),(3),
(-9223372036854775808),
(9223372036854775807),
(2147483647),(-2147483648)
Quando executo a seguinte consulta (sem sentido):
SELECT a.col1, a.col2
FROM Table1 a, Table1 b
WHERE b.col1 > 2147483648
Vejo que ele fará um desenho de loop aninhado no resultado da busca por índice e um cálculo escalar (a partir de uma constante).
Observe que o literal é maior que maxint. Ajuda escrever CAST(2147483648 as BIGINT)
. Alguma idéia de por que o MSSQL está adiando isso para o plano de execução e existe uma maneira mais curta de evitá-lo do que usar o elenco? Isso afeta parâmetros vinculados a instruções preparadas (do jtds JDBC) também?
O cálculo escalar nem sempre é feito (parece ser o índice de busca específico). E, às vezes, o analisador de consultas não o mostra graficamente, mas como col1 < scalar(expr1000)
nas propriedades do predicado.
Eu já vi isso com o MS SSMS 2016 (13.0.16100.1) e o SQL Server 2014 Expres Edition 64bit no Windows 7, mas acho que é um comportamento geral.