交叉连接产生多次读取其中一个表的执行计划

Luí*_*ade 3 sql-server

我有一个查询,我需要将一个有 5 行的小表交叉连接到一个大约有 31k 行的表。SQL Server 提出的执行计划在两个表中进行索引扫描,并将它们与嵌套循环 (INNER JOIN) 连接起来。但是,在检查执行计划时,我注意到对较小表的扫描为下一步生成了 5 x 31k = 155k 行。这是否意味着 SQL Server 正在扫描较小表的索引 31k 次?

这是我遇到的问题的小复制:

CREATE TABLE A (id INT PRIMARY KEY);

CREATE TABLE B (id INT PRIMARY KEY);

INSERT INTO A(id)
    VALUES (1), (2), (3), (4), (5);

INSERT INTO B(id)
    VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9)


SELECT * FROM A CROSS JOIN B
Run Code Online (Sandbox Code Playgroud)

这是SELECT命令 的查询实时统计信息这是<code>SELECT</code>命令的查询实时统计

我的问题是,小表上的索引扫描是否正在执行多个 I/O 操作,大表上的每一行一个,而不是只执行一次并且只将其结果提供给以下步骤一次。

Eri*_*ing 6

我的问题是,小表上的索引扫描是否正在执行多个 I/O 操作,大表上的每一行一个,而不是只执行一次并且只将其结果提供给以下步骤一次。

是的,对于 A 中的每一行,您都需要为 B 生成所有行。由于 A 中有五行,因此您要前往 B 次。

Cross Joins 只能用 Nested Loops 来实现,这是它的正常行为。