【发布时间】:2015-01-19 11:35:13
【问题描述】:
有谁知道为什么sql server 选择查询表'building'两次?有什么解释吗?可以只用一个 table seek 来完成吗?
这是代码示例:
DECLARE @id1stBuild INT = 1
,@number1stBuild INT = 2
,@idLastBuild INT = 5
,@numberLastBuild INT = 1;
DECLARE @nr TABLE (nr INT);
INSERT @nr
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
CREATE TABLE building (
id INT PRIMARY KEY identity(1, 1)
,number INT NOT NULL
,idStreet INT NOT NULL
,surface INT NOT NULL
)
INSERT INTO building (number,idStreet,surface)
SELECT bl.b
,n.nr
,abs(convert(BIGINT, convert(VARBINARY, NEWID()))) % 500
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY n1.nr) b
FROM @nr n1
CROSS JOIN @nr n2
CROSS JOIN @nr n3
) bl
CROSS JOIN @nr n
--***** execution plan for the select below
SELECT *
FROM building b
WHERE b.id = @id1stBuild
AND b.number = @number1stBuild
OR b.id = @idLastBuild
AND b.number = @numberLastBuild
DROP TABLE building
对此的执行计划总是相同的:两个 Clustered Index Seek 通过 Merge Join (Concatenation) 统一起来。其余的不太重要。 这是执行计划:
【问题讨论】:
-
您的 where 子句缺少括号。我认为这可能是造成这种情况的原因...
(b.id=@id1stBuild AND b.number=@number1stBuild) OR (b.id=@idLastBuild AND b.number=@numberLastBuild)因为OR -
感谢您的快速回复。我试了一下,还是一样的执行计划。
标签: sql sql-server sql-execution-plan