当前位置:  开发笔记 > 数据库 > 正文

如何选择和优化oracle索引?

如何解决《如何选择和优化oracle索引?》经验,为你挑选了2个好方法。

我想知道是否有创建索引的一般规则.如何选择应在此索引中包含哪些字段或何时不包含这些字段?

我知道它总是取决于环境和数据量,但我想知道我们是否可以制定一些全局接受的关于在Oracle中制作索引的规则.



1> David Aldrid..:

Oracle文档有索引选择一个优秀组的考虑:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

引用:

考虑索引WHERE子句中经常使用的键.

考虑索引经常用于连接SQL语句中的表的键.有关优化联接的详细信息,请参阅"使用哈希群集进行性能"一节.

选择具有高选择性的索引键.索引的选择性是表中具有相同索引键值的行的百分比.如果少数行具有相同的值,则索引的选择性是最佳的.注意:Oracle会自动为您使用完整性约束定义的唯一键和主键的键和表达式创建索引或使用现有索引.如果数据分布偏斜,则索引低选择性列可能会有所帮助,这样一个或两个值的出现频率远低于其他值.

不要在具有很少不同值的键或表达式上使用标准B树索引.这些键或表达式通常具有较差的选择性,因此除非频繁选择的键值出现频率低于其他键值,否则不会优化性能.在这种情况下,您可以有效地使用位图索引,除非频繁修改索引,如在高并发OLTP应用程序中.

不要索引经常修改的列.修改索引列的UPDATE语句和修改索引表的INSERT和DELETE语句比没有索引的时间要长.此类SQL语句必须修改索引中的数据以及表中的数据.它们还会生成其他撤消和重做.

不要索引仅出现在具有函数或运算符的WHERE子句中的键.使用除MIN或MAX之外的函数的WHERE子句或具有索引键的运算符不会使使用索引的访问路径(基于函数的索引除外)不可用.

在大量并发INSERT,UPDATE和DELETE语句访问父表和子表的情况下,请考虑索引引用完整性约束的外键.这样的索引允许父表上的UPDATE和DELETE而不共享锁定子表.

当选择指数的关键,考虑查询的性能增益是否值得为插入,更新和删除并使用存储索引所需的空间的性能损失.您可能希望通过比较带有和不带索引的SQL语句的处理时间来进行实验.您可以使用SQL跟踪工具测量处理时间.



2> Tony Andrews..:

有些事情你应该总是索引:

主键 - 自动为这些键提供索引(除非您为Oracle指定合适的现有索引)

唯一键 - 这些键自动赋予索引(同上)

外键 - 这些不会自动编入索引,但您应该添加一个以避免在检查约束时出现性能问题

之后,查找经常用于过滤查询的其他列:典型的例子是人们的姓氏.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有