Cuando miro el plan de ejecución real de algunas de mis consultas, noto que las constantes literales utilizadas en una cláusula WHERE se muestran como una cadena anidada de escaneo constante y escalar de cálculo .
Para reproducir esto, uso la siguiente tabla
CREATE TABLE Table1 (
[col1] [bigint] NOT NULL,
[col2] [varchar](50) NULL,
[col3] [char](200) NULL
)
CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC)
Con algunos datos en él:
INSERT INTO Table1(col1) VALUES (1),(2),(3),
(-9223372036854775808),
(9223372036854775807),
(2147483647),(-2147483648)
Cuando ejecuto la siguiente consulta (sin sentido):
SELECT a.col1, a.col2
FROM Table1 a, Table1 b
WHERE b.col1 > 2147483648
Veo que hará un dibujo de Nested Loop en el resultado de Index Seek y un cálculo escalar (de una constante).
Tenga en cuenta que el literal es mayor que maxint. Ayuda a escribir CAST(2147483648 as BIGINT)
. ¿Alguna idea de por qué MSSQL está retrasando eso al plan de ejecución y hay una forma más corta de evitarlo que usar el yeso? ¿Afecta también los parámetros vinculados a las declaraciones preparadas (de jtds JDBC)?
El cálculo escalar no siempre se realiza (parece ser un índice de búsqueda específico). Y a veces el analizador de consultas no lo muestra gráficamente, sino como col1 < scalar(expr1000)
en las propiedades del predicado.
He visto esto con MS SSMS 2016 (13.0.16100.1) y SQL Server 2014 Expres Edition 64bit en Windows 7, pero supongo que es un comportamiento general.