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可能选择了次优算法
------解决方案--------------------好有深度的问题,学习!
------解决方案--------------------学习中
回复内容太短了回复内容太短了
------解决方案--------------------学习了, 数据库永远是一个学不完的东东
------解决方案--------------------关注~
回复内容太短!
------解决方案--------------------是不是和查询一样,有二分法呀!呵呵!不懂,只是猜测!期待高手解答
------解决方案--------------------天啊 我看不懂题目 天啊 我看不懂题目 天啊 我看不懂题目 天啊 我看不懂题目
------解决方案--------------------看来我看不懂啊,等待高手详细分析
------解决方案--------------------