当我查看某些查询的实际执行计划时,我注意到WHERE子句中使用的文字常量显示为计算标量和常量扫描的嵌套链。
要重现此,我使用下表
CREATE TABLE Table1 (
[col1] [bigint] NOT NULL,
[col2] [varchar](50) NULL,
[col3] [char](200) NULL
)
CREATE NONCLUSTERED INDEX IX_Table1 ON Table1 (col1 ASC)
其中包含一些数据:
INSERT INTO Table1(col1) VALUES (1),(2),(3),
(-9223372036854775808),
(9223372036854775807),
(2147483647),(-2147483648)
当我运行以下(废话)查询时:
SELECT a.col1, a.col2
FROM Table1 a, Table1 b
WHERE b.col1 > 2147483648
我看到它将在Index Seek和标量计算(根据常量)的结果中进行嵌套循环绘制。
请注意,文字大于maxint。它确实有助于写作CAST(2147483648 as BIGINT)
。您知道为什么MSSQL会在执行计划中使用它吗?有没有比使用强制转换更短的方法来避免它了?它是否也会影响到预准备语句的绑定参数(来自jtds JDBC)?
标量计算并不总是完成的(似乎是特定于索引查找的)。有时查询分析器不会以图形方式显示它,而是像col1 < scalar(expr1000)
谓词属性中那样。
我已经在Windows 7上使用MS SSMS 2016(13.0.16100.1)和SQL Server 2014 Expres Edition 64bit看到了这一点,但我想这是一个普遍的行为。