Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 原因是什么;当我们创建索引时,CPU成本比普通的select查询要低;?_Database_Oracle - Fatal编程技术网

Database 原因是什么;当我们创建索引时,CPU成本比普通的select查询要低;?

Database 原因是什么;当我们创建索引时,CPU成本比普通的select查询要低;?,database,oracle,Database,Oracle,请建议我回答上述问题。 问:原因是什么 “当我们创建索引时,CPU成本比普通的select查询要低。” 看看在查询没有索引的表时CPU需要与deptno 200进行多少比较: 琼斯100 米勒200 史密斯100 布莱克300 索耶300 现在与索引相同: 琼斯、史密斯 200->Miller 300->Sawyer 当我们创建索引时,CPU成本比正常的select查询要低并不总是正确的。 如果没有使用索引来计算谓词(在where子句中),那么就没有使用索引。在这种情况下,考虑创建新的索

请建议我回答上述问题。 问:原因是什么 “当我们创建索引时,CPU成本比普通的select查询要低。”

看看在查询没有索引的表时CPU需要与deptno 200进行多少比较:

  • 琼斯100
  • 米勒200
  • 史密斯100
  • 布莱克300
  • 索耶300
现在与索引相同:

  • 琼斯、史密斯
  • 200->Miller
  • 300->Sawyer

当我们创建索引时,CPU成本比正常的select查询要低
并不总是正确的。

如果没有使用索引来计算谓词(在where子句中),那么就没有使用索引。在这种情况下,考虑创建新的索引或重写语句或查询,以便使用索引。例如,当比较谓词(等式和不等式)的一侧或中间谓词中出现单列时,索引只能用于计算WHERE子句。索引的存在确实会降低诸如更新、插入、删除和创建视图等写操作的速度。如果一个应用程序对一个表执行很少的读操作,但有很多次写操作,那么该表上的索引可能会损害整体性能,而不是帮助它

根据oracle,索引是与表和集群关联的可选结构,允许SQL语句对表更快地执行。正如本手册中的索引帮助您比没有索引时更快地定位信息一样,Oracle数据库索引提供了更快的表数据访问路径。您可以在不重写任何查询的情况下使用索引。您的结果是相同的,但您可以更快地看到它们

通常,请在下列任一列中创建索引:

该列经常被查询。 列上存在引用约束。 列上存在唯一的键约束

索引在逻辑和物理上独立于关联表中的数据。作为独立结构,它们需要存储空间。可以在不影响基表、数据库应用程序或其他索引的情况下创建或删除索引。在插入、更新和删除关联表的行时,数据库会自动维护索引。如果删除索引,所有应用程序都将继续工作。但是,访问以前索引的数据可能会较慢

这篇文章解释了更多关于索引的内容。一定要读一读

回答您的问题, 如果使用得当,每个段的逻辑读取都在索引对象上。当您按索引读取表时,CPU性能良好,因为oracle读取带索引和不带索引的块(以及哪些块)的方式不同

让我们看看索引是如何在内部工作的。请阅读更多关于此的信息

考虑一个OLTP DB,其中一个表具有B树索引。B树索引是按顺序排列的值列表,这些值被划分为多个范围,其中一个键与一行或一系列行关联,从而为精确匹配和范围搜索等查询提供了优异的检索性能

这种类型的索引包含3种类型的块-根块、一个或多个分支块和一个或多个叶块。根块保存指向分支块的键和指针,分支块又保存指向叶块的指针,叶块包含已索引的键(数据)值以及Oracle数据库表中与每个键值关联的行的rowid

分支块包含能够选择所需分支和指向包含键的子块的指针所需的最小键前缀。键和指针的数量受块大小的限制

索引叶块是双链接的-每个块包含指向下一个和上一个叶块的指针

B树索引始终是平衡的,因为索引的高度(索引中的级别数)在整个索引中是相同的。换句话说,为了找到与任何特定索引值关联的rowid而必须读取的块数不依赖于该值。例如,如果在示例Oracle数据库中的employee表的last_name列上有一个索引,则需要读取以查找与“Ernst”关联的rowid的数目或块数将与“King”相同

b树索引的高度是从根块到叶块所需的块数。对于具有一级分支块的索引,其高度为3(1个根块+1个分支块+1个叶块)

其他“常识”事项:

  • 按计划重新生成索引。每个人都知道索引需要重建
  • 必须按表空间将表与索引分开,这只是常识
  • 如果查询没有使用索引,则优化器做了错误的事情
select * from emp where deptno = 200;