【发布时间】:2015-12-08 20:15:24
【问题描述】:
我已经阅读了很多关于 Oracle 索引和各种类型的索引扫描的文章,尤其是快速全扫描 (ffs)。我的问题将是关于不同索引定义的 ffs 的性能。我将描述我认为我对索引构建和快速全扫描的了解,因为很可能,我的理解存在漏洞或错误。
Oracle 的索引通常由 B 树支持,其中分支是指向已排序键范围的指针。生成的键取决于索引指定的列。
如果我在列 (A, B) 上有一个索引,那么按照排序顺序,一些叶节点可能看起来像这样。关键是首先对 A 列进行排序,然后对 B 列进行排序。每个键都指向表中的某个行 ID。
A1-B1 -> rowid 5
A1-B1 -> rowid 7
A1-B2 -> rowid 12
A1-B3 -> rowid 24
A2-B3 -> rowid 123
A2-B3 -> rowid 2412
A2-B3 -> rowid 241
A3-B1 -> rowid 234
A3-B2 -> rowid 213
假设我们有 2 个分支,这些分支可能包含以下数据
Branch 1:
Range: A1-B1 to A2-B3
Children Leaf nodes with row ids: [5, 7, 12, 24, 123]
Branch 2:
Range: A2-B3 to A3-B2
Children Leaf nodes with row ids: [2412, 241, 234, 213]
查找应该只是简单的二分查找。
关于快速全扫描:我理解如果一个查询只选择索引包含的列,那么我们不需要看表。索引充当微型/瘦表,即我们可以直接查询索引而无需查找表。只要查询没有 ORDER BY 子句,我们就可以使用快速全扫描来扫描索引。我相信快速全扫描只是通过我们拥有的任何选择器子句来查找多个块和过滤器。
最后是我的问题:
考虑两个索引 X 和 Y:
X is an index on columns (A, B)
Y is an index on columns (A, B, C)
我假设以下 SQL 应该使用 ffs 执行 X 和 Y 索引。
select count(1) from table where A in (a1, a2) and B <= b';
两个索引在 ffs 期间是否存在性能差异? 索引 Y 执行“较慢”是因为 SQL 仅在 A 和 B 上具有谓词吗?
我也想知道“多块读取”是什么意思。什么是块?是叶子节点的一部分吗?使用上面的例子,分支 1 的所有叶子节点都是一个块,分支 2 的所有叶子节点都是另一个块吗?这是多线程、分而治之的阅读方式吗?即每个线程读取自己的块并聚合结果?
谢谢!
【问题讨论】:
-
“块”只是 Oracle 处理其数据的最小逻辑单元。您可以从文档中找到更多信息:docs.oracle.com/html/A96524_01/c03block.htm
-
谢谢!会看链接
标签: sql oracle performance indexing