2010-10-19 116 views
3

IMO,请指正...
聚集索引的叶含有真正的表行,充满聚集索引,与中间叶,含有比全表更多的数据(?)
为什么/时/如何是否在整个表扫描中选择了整个聚簇索引扫描?为什么/何时/如何选择整个聚簇索引扫描而不是全表扫描?

在SELECT查询中使用的CUSTOMER_ID列上的聚簇索引如何不在SELECT列表或WHERE条件[1]中包含它?

更新:
我应该明白,全聚集扫描比全表扫描速度更快,因为“每个数据页包含指向下一个和以前的叶节点页面,以便扫描并不需要使用更高级别的网页在索引中“?
是否有任何其他原因像(非参与查询)聚簇索引用于排序?

UPDATE2:
至于事后,连续访问不能给的性能提升,同时通过IAM指针装表可以并行。
聚集索引扫描是否意味着连续读取页面?
聚簇表是否意味着没有IAM指针(无法进行全表扫描)?
为什么不能对全表进行全表扫描?
我还是不明白如何/为什么聚簇索引全扫描可以比全表扫描“更好”。
这是否意味着聚集索引可能导致性能恶化?

问题是关于聚簇表非堆(非索引)表。

UPDATE3:
是“全聚集索引扫描”真的同义词“全表扫描”?
有什么区别?

[1]索引覆盖增强SQL Server查询性能
http://www.devx.com/dbzone/Article/29530

+0

聚簇索引扫描不一定比表扫描更快,但表扫描只发生在堆上(即没有聚簇索引的表)。 “堆扫描”对于表扫描更准确,因为表是逻辑结构,而堆和索引是执行计划中使用的物理结构。 – sqlvogel 2010-10-19 19:03:43

回答

0

请阅读我的回答“没有直接访问聚集表中的数据行 - 为什么?”首先是

“聚集索引的叶含有真正的表行,充满聚集索引,与中间叶,含有比全表更多的数据(?)”

见你混合了“表“与存储结构。在你的问题的背景下,例如。考虑CI的大小而不是“表”,那么你必须考虑CI减去叶级(这是数据行)。 CI,索引部分只是很小的。中间级别(如任何B-Tree)包含部分(不完整)键条目;它排除了最低级别,它是整个键入口,它位于该行本身,并且不被重复。

该表(完整配置项)可能为10GB。 CI仅可能是10MB。有很多可以从10MB来确定,而不必去100GB。

理解:同一表(CI)上的等效NCI可能为22MB;如果您删除配置项,则同一个表上的等效NCI可能为21.5MB(假设CI密钥合理,不会变宽)。

“为什么/何时/如何在全表扫描中选择整个聚簇索引扫描?”

很多时候。同样的背景是,我们正在谈论CI减叶水平。对于只使用CI中的列的查询,CI中这些列的存在(实际上是任何索引)允许查询为“覆盖查询”,这意味着它可以通过索引完全服务,不需要去到数据行。思考部分按键的范围扫描:BETWEEN x AND yY; x < = y;等

(总是存在这样的优化器会选择一个表扫描,有机会时你认为它应该选择索引扫描,BUŧ这是一个不同的故事。)

“我仍然不知道如何/为什么聚簇索引全扫描可以比全表扫描“更好”。“

(MS使用的术语比我在这里的答案不太精确。)对于任何可以从10MB CI回答的查询,我宁愿在数据缓存中翻动10MB,而不是100GB。对于CI密钥范围内的相同查询,这是10MB的一小部分。

对于需要“全表扫描”的查询,是的,您必须阅读CI的所有叶页,即100GB。

2

聚集索引 - 或者更准确地说:它的叶子页ARE表数据 - 这样一个聚集索引扫描真的是一样的作为表扫描(对于具有聚集索引的表)。

如果你没有聚簇索引,那么你的表就是一堆 - 显然,在这种情况下,如果你需要查看所有的数据,你不能做聚簇索引扫描,因为没有聚簇索引,所以你最终会得到一个表扫描,它只是触及堆表的所有数据页面。

2

聚簇索引的叶级是表。 “表扫描”是指没有聚集索引的堆。

每个数据页面都包含指向下一个和上一个叶节点页面的指针,因此扫描不需要在索引中使用更高级别的页面。