执行计划中的不解

听雨停了 2018-08-01 04:53:54

USE tempdb
GO
IF OBJECT_ID('dbo.NumSeq','U') IS NOT NULL
DROP TABLE dbo.NumSeq;
CREATE TABLE dbo.NumSeq(
seqval INT NOT NULL CONSTRAINT Pk_NumSeq PRIMARY KEY
);
INSERT INTO dbo.NumSeq(seqval) VALUES
(2),(3),(11),(12),(13),(27),(33),(34),(35),(42);

SELECT seqval
FROM dbo.NumSeq AS a
WHERE NOT EXISTS (
SELECT *
FROM dbo.NumSeq AS b
WHERE b.seqval = a.seqval + 1
)

DROP TABLE NumSeq;



这个图片是上面查询语句产生的执行计划,我不理解的是下面这个聚集索引扫描实际行数为什么是78条
...全文
313 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
听雨停了 2018-08-03
  • 打赏
  • 举报
回复
引用 5 楼 zjcxc 的回复:
SCAN 的操作,能找到不结束 了,找不到要找完所有的数据,所以各条记录要读取的记录数如下(第2列),加起来的结果就是 78
2 2
3 10
11 4
12 5
13 10
27 10
33 8
34 9
35 10
42 10

可是聚集索引不是已经排序了的吗?当找第二行,不是应该找到11发现还是没有就结束了的吗?
听雨停了 2018-08-03
  • 打赏
  • 举报
回复
引用 9 楼 zjcxc 的回复:
你说的顺序的查找,对应的是 SEEK 操作,但现在执行计划用的是 SCAN,也就是顺序在这里没用上

明白了,谢谢了
zjcxc 元老 2018-08-03
  • 打赏
  • 举报
回复
你说的顺序的查找,对应的是 SEEK 操作,但现在执行计划用的是 SCAN,也就是顺序在这里没用上
zjcxc 元老 2018-08-03
  • 打赏
  • 举报
回复
执行计划上是写的 SCAN (索引扫描),不是 SEEK,SCAN 的操作就是没找到就找完所有的呗
听雨停了 2018-08-02
  • 打赏
  • 举报
回复
引用 2 楼 zjcxc 的回复:
嵌套循环联接也称为“嵌套迭代”,它将一个联接输入用作外部输入表(显示为图形执行计划中的顶端输入),将另一个联接输入用作内部(底端)输入表。外部循环逐行处理外部输入表。内部循环会针对每个外部行执行,在内部输入表中搜索匹配行。
----- 所以嘛,既然是每一行都会在内部表中查找一次,读 78 条不是很正常的事了?


2 3 2(聚集索引扫描到Seqval=3的这一行就结束了)
3 4 3(聚集索引扫描到Seqval=11的这一行就结束了)
11 12 4(...)
12 13 5
13 14 6
27 28 7
33 34 8
34 35 9
35 36 10
42 43 10

我不知道是不是这样理解哈,上面这个第一列对应第一个聚集索引扫描,得到NumSeq表a中的10行数据,第二列对应计算标量后得到的值,也就是Seqval+1,第三列对应的是第二个聚集索引扫描,也就是表b每次扫描得到的行数。但是最后第三列加起来的值是62啊,这个78怎么来的啊。
听雨停了 2018-08-02
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
先把这个PK 的树,构造出来,再每个值都遍历一下数数。

可以先少量数据,这 10 个数据,还是有点多。


2 3 2(聚集索引扫描到Seqval=3的这一行就结束了)
3 4 3(聚集索引扫描到Seqval=11的这一行就结束了)
11 12 4(...)
12 13 5
13 14 6
27 28 7
33 34 8
34 35 9
35 36 10
42 43 10

我不知道是不是这样理解哈,上面这个第一列对应第一个聚集索引扫描,得到NumSeq表a中的10行数据,第二列对应计算标量后得到的值,也就是Seqval+1,第三列对应的是第二个聚集索引扫描,也就是表b每次扫描得到的行数。但是最后第三列加起来的值是62啊,这个78怎么来的啊。
zjcxc 元老 2018-08-02
  • 打赏
  • 举报
回复
嵌套循环联接也称为“嵌套迭代”,它将一个联接输入用作外部输入表(显示为图形执行计划中的顶端输入),将另一个联接输入用作内部(底端)输入表。外部循环逐行处理外部输入表。内部循环会针对每个外部行执行,在内部输入表中搜索匹配行。
----- 所以嘛,既然是每一行都会在内部表中查找一次,读 78 条不是很正常的事了?
zjcxc 元老 2018-08-02
  • 打赏
  • 举报
回复
SCAN 的操作,能找到不结束 了,找不到要找完所有的数据,所以各条记录要读取的记录数如下(第2列),加起来的结果就是 78
2 2
3 10
11 4
12 5
13 10
27 10
33 8
34 9
35 10
42 10
卖水果的net 版主 2018-08-01
  • 打赏
  • 举报
回复
先把这个PK 的树,构造出来,再每个值都遍历一下数数。

可以先少量数据,这 10 个数据,还是有点多。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧