Lorsque je regarde le plan d'exection réel de certaines de mes requêtes, je remarque que les constantes littérales utilisées dans une clause WHERE apparaissent comme une chaîne imbriquée de calcul scalaire et de balayage constant .
Pour reproduire cela, j'utilise le tableau suivant
CREATE TABLE Table1 (
[col1] [bigint] NOT NULL,
[col2] [varchar](50) NULL,
[col3] [char](200) NULL
)
CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC)
Avec quelques données:
INSERT INTO Table1(col1) VALUES (1),(2),(3),
(-9223372036854775808),
(9223372036854775807),
(2147483647),(-2147483648)
Lorsque j'exécute la requête (non-sens) suivante:
SELECT a.col1, a.col2
FROM Table1 a, Table1 b
WHERE b.col1 > 2147483648
Je vois qu'il fera un dessin de boucle imbriquée dans le résultat de la recherche d'index et un calcul scalaire (à partir d'une constante).
Notez que le littéral est plus grand que maxint. Cela aide à écrire CAST(2147483648 as BIGINT)
. Avez-vous une idée de la raison pour laquelle MSSQL transfère cela au plan d'exécution et existe-t-il un moyen plus court de l'éviter que d'utiliser la distribution? Cela affecte-t-il également les paramètres liés aux instructions préparées (à partir de jtds JDBC)?
Le calcul scalaire n'est pas toujours fait (semble être spécifique à la recherche d'index ). Et parfois, l'analyseur de requêtes ne l'affiche pas graphiquement mais comme col1 < scalar(expr1000)
dans les propriétés de prédicat.
J'ai vu cela avec MS SSMS 2016 (13.0.16100.1) et SQL Server 2014 Expres Edition 64bit sur Windows 7, mais je suppose que c'est un comportement général.