首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >交叉连接生成多次读取其中一个表的执行计划。

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

Database Administration用户
提问于 2019-02-06 18:40:41
回答 2查看 894关注 0票数 3

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

下面是我遇到的问题的一个小复制品:

代码语言:javascript
运行
复制
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

下面是SELECT命令的查询实时统计信息

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

EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-02-06 19:18:54

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

是的,对于A中的每一行,您都需要为B生成所有行,因为A中有五行,所以您需要对B进行五次旅行。

交叉连接只能用嵌套的循环实现,这是它的正常行为。

票数 6
EN

Database Administration用户

发布于 2019-02-06 19:18:20

是的,嵌套环连接将为外部输入中的每一行运行底部(内部)输入。

使用相同的示例数据,您可以将查询更改为一个完全外部连接,而不需要连接条件,并且(在我的机器上),结果是一个带有合并连接的计划。

代码语言:javascript
运行
复制
SELECT * FROM A full outer  JOIN B
on 1=1
票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/229070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档