请建议我回答上述查询。Q “当我们创建索引时,CPU 成本比普通选择查询低”是什么原因?
2 回答
When we create an index then CPU cost is less as compared to normal select query
并非总是如此。
如果不使用索引来评估谓词(在 where 子句中),那么就没有使用索引。在这种情况下,请考虑创建新索引或重写语句或查询,以便可以使用索引。例如,当单个列出现在比较谓词(等式和不等式)的一侧或 BETWEEN 谓词中时,索引只能用于评估 WHERE 子句。索引的存在确实减慢了诸如 UPDATE、INSERT、DELETE 和 CREATE VIEW 之类的写入操作。如果应用程序对表执行的读取次数很少但写入次数较多,则该表上的索引可能会损害整体性能而不是帮助它。
根据 oracle文档,索引是与表和集群相关联的可选结构,允许 SQL 语句对表更快地执行。正如本手册中的索引可以帮助您比没有索引时更快地定位信息一样,Oracle 数据库索引提供了更快的表数据访问路径。您可以使用索引而无需重写任何查询。您的结果是相同的,但您可以更快地看到它们。
一般来说,在以下任何一种情况下,都可以在列上创建索引:
该列被频繁查询。列上存在引用约束。列上存在 UNIQUE 键约束。
索引在逻辑上和物理上独立于关联表中的数据。作为独立的结构,它们需要存储空间。您可以在不影响基表、数据库应用程序或其他索引的情况下创建或删除索引。当您插入、更新和删除关联表的行时,数据库会自动维护索引。如果删除索引,所有应用程序将继续工作。但是,访问以前索引的数据可能会更慢。
这篇漂亮的文章解释了有关索引的更多信息。一定要读一读。
回答您的问题, 如果使用得当,每个段的逻辑读取都在索引对象上。当您按索引读取表时,CPU 性能很好,因为 oracle 如何读取有和没有索引的块(以及哪些块)是不同的。
让我们看看索引是如何在内部工作的。阅读本文档的更多信息
考虑一个 OLTP DB,其表具有 B-Tree 索引。B 树索引是按范围划分的值的有序列表,其中键与行或行范围相关联,从而为精确匹配和范围搜索等查询提供出色的检索性能。
这种类型的索引包含 3 种类型的块——根块、一个或多个分支块和一个或多个叶块。根块保存键和指向分支块的指针,分支块又保存指向叶块的指针,叶块包含已被索引的键(数据)值以及与每个键值关联的 Oracle 数据库表中的行的 rowid。
分支块包含能够选择所需分支所需的最小键前缀和指向包含该键的子块的指针。键和指针的数量受块大小的限制。
索引叶块是双链接的——每个块都包含指向下一个和前一个叶块的指针。
B-tree 索引总是平衡的,因为索引的高度(索引中的级别数)在整个索引中是相同的。换句话说,必须读取以查找与任何特定索引值关联的 rowid 的块数不依赖于该值。例如,如果您在示例 Oracle 数据库中的员工表的 last_name 列上有一个索引,则需要读取以查找与“Ernst”关联的 rowid 的数量或块将与“King”相同。
b 树索引的高度是从根块到叶块所需的块数。对于具有一级分支块的索引,高度为 3(1 个根块 + 1 个分支块 + 1 个叶块)。
其他“常识”的东西:
- 按计划重建索引。每个人都知道索引需要重建
- 您必须通过表空间将表与索引分开,这只是常识
- 如果您的查询没有使用您的索引,则优化器做错了
select * from emp where deptno = 200;
看看在查询没有索引的表时 CPU 需要与 deptno 200 进行多少次比较:
- 琼斯 100
- 米勒 200
- 史密斯 100
- 布莱克 300
- 索耶 300
- ...
现在与索引相同:
- 100 -> 琼斯,史密斯,...
- 200 -> 米勒,...
- 300 -> 索耶,...