日期:2014-05-18  浏览次数:20570 次

select count(*) from tb是否需要扫描全部的索引中间层?
表tb有聚集索引,有13个索引中间页.
那么在select count(*) from tb时,发现全走全部的索引中间层叶.

从理论上讲,由于每个数据页都记录着它的上一个page和下一个page,那么最小的io读取应该是:
读根页--->读最小的中间页--->读数据叶子---->依次往后读全部数据页.

但实际上却是读取全部的索引中间页,谁能解释一下?

附部分代码:
SQL code

use tempdb
go
CREATE TABLE tmp (id int  ,c1 char(500),c2 char(500))
CREATE CLUSTERED INDEX CI_id ON tmp(id)
DECLARE @i INT
SET @i=0
WHILE @i<20129
BEGIN
    INSERT INTO tmp(id,c1,c2)
    SELECT @i,'a','z'
    SET @i=@i+1
END

set statistics io on
select COUNT(*) from tmp

DBCC IND(tempdb,tmp,-1)

dbcc traceon(3604)
dbcc page(tempdb,1,1666,3)
dbcc page(tempdb,1,196,3)
dbcc page(tempdb,1,193,3)





------解决方案--------------------
这些问题 值得推荐探讨
------解决方案--------------------
SF是我的
------解决方案--------------------
1111111111111111111111111
------解决方案--------------------

------解决方案--------------------
看了下不懂!~~~~~~~~~~
------解决方案--------------------
學習~~
------解决方案--------------------

------解决方案--------------------
强烈学习.....................
------解决方案--------------------
1.最小的io读取应该是:读根页--->读最小的中间页--->读数据叶子---->依次往后读全部数据页
2.实际上却是读取全部的索引中间页

→ 不是加了聚集索引,就一定走最小的io读取吧 ? 是不是该这么理解?
------解决方案--------------------

------解决方案--------------------
如果什么条件都没有不是应该把所有的数据页都读出来再流聚合吗,为什么不走全部的数据页呢?
------解决方案--------------------
从根节点到所有的页节点可以不用走全部的中间节点吗?
------解决方案--------------------
学习中,期待进一步的解答。 关注中。。。
------解决方案--------------------
路过,关注,学习.....
------解决方案--------------------

------解决方案--------------------
路过学习

回复内容太短了!
------解决方案--------------------
queryer可能选择了次优算法
------解决方案--------------------
好有深度的问题,学习!
------解决方案--------------------
学习中

回复内容太短了回复内容太短了
------解决方案--------------------
学习了, 数据库永远是一个学不完的东东
------解决方案--------------------
关注~
回复内容太短!
------解决方案--------------------
是不是和查询一样,有二分法呀!呵呵!不懂,只是猜测!期待高手解答

------解决方案--------------------
天啊 我看不懂题目 天啊 我看不懂题目 天啊 我看不懂题目 天啊 我看不懂题目
------解决方案--------------------
看来我看不懂啊,等待高手详细分析
------解决方案--------------------