oracle 索引优化_索引必须是唯一的吗

(1) 2024-08-17 17:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
oracle 索引优化_索引必须是唯一的吗,希望能够帮助你!!!。

1.Oracle优化

说到Oracle的优化首先要提到就是索引,这是Oracle优化中效果最明显的方式

oracle优化的几个常见方式:

1.对需要经常用到查询的字段建立索引;

2.利用Oracle的解析方式进行数据优化,Oracle的解析方式是自后而前,自右向左,自下而上的方式进行解析SQL,所以利用这个原理,from后面如果有3个以上的表连接查询,将被其他表引用的那个表放在最后面,where后面有多个查询条件时,表连接的条件写在where条件的左边,能过滤掉最大数量的条件写在最后边;

3.对于一个简单的查询SQL,oracle的执行顺序一般是:1-from,2-where,3-group by,4-having,5-select,6-order by,所以能放在where后面的条件,尽量不要放在having后面,因为oracle是先处理where后面的条件,再处理having后面的条件;

4.使用exists的查询效率要高于用in,in的效率高于or,所以能用exists不用in,能用in的不用or;

5.能使用=进行精准查询的时候,尽量不要使用like这样的模糊查询,模糊查询会降低查询效率;

6.在处理大量数据时,大于等于的效率高于大于,比如同样一个条件>2和>=3,>=3的效率会比>2要高一些,因为前者是直接定位到3,再处理3之后的数据,后者是先定位到2,再从2往后推取之后的第一个数据3;

7.用merge代替update,用merge的好处是可以少扫描一次源表,而且更容易调整执行计划。而update通常都是采用类似nested loop的方式进行表之间的连接,并且把被update的表作为外层驱动表,如果该表比较大,则执行效率会很差,这也是为什么要使用merge的原因;

8.不在索引列进行运算,不使用not(改用<>或者> or <)对索引列进行判断,不再索引列进行空值的判断,如name is null,当对索引列进行运算时,优化器不会使用索引,转而进行全表扫描。

9.模糊查询的通配符出现在检索词的词首时也会导致索引失效,出现在其他位置时则不会有影响select * from student where name like '%wish%';

10.避免使用select *,多表连接时尽可能使用表和字段的别名;

11.能用truncate时,不使用delete,delete会产生大量的日志,影响效率。

  2.索引

2.1适合建索引的特点

1)在经常需要搜索的列上,可以加快搜索的速度; 

2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 

3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 

4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 

5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 

6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度;

7)基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用;基于非唯一性索引的检索。

2.2不适合建索引的特点

1)对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 

2)对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 

3)对于那些定义为blob数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 

4)当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

2.3索引的分类

索引大致分为两类,一是B-tree索引,一是位图索引(Bitmapt),Oracle默认创建的就是B-tree索引,简单来说二者的区别就是B-tree索引适合建立在数据差异较大的字段,比如姓名,学号,位图索引适合建立在数据差异较小的字段,比如性别。但是在实际业务运用中也还需要根据具体的情况进行辨别是否使用索引,具体使用哪个索引,比如一个字段sex,他只有男和女,数据量相当,那创建索引实际上最多只能过滤掉一半的数据。比如一个字段is_true,他的结果只有是和否,但是否的数据量相对较少,那建立索引后对需要经常查否的数据来说就会很有效。

B-tree 特点:
适合与大量的增、删、改(OLTP)
不能用包含OR操作符的查询;
适合高基数的列(唯一值多)
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围;

Bitmapt 特点:
适合与决策支持系统;
做UPDATE代价非常高;
非常适合OR操作符的查询;
基数比较少的时候才能建位图索引;

不常见的还有复合索引、函数索引、哈希索引和分区索引,复合索引也就是基于多个列创建的索引,这种索引只有在第一个列被where子句使用到时,优化器才会使用到该索引。

注:索引是把双刃剑,虽然建立索引能有效地提高查询效率,但索引也需要占大量的表空间和物理空间,后期还需要经常维护,所以建立索引要慎重选择。

2.4

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复