1. 首页
  2. 数据库
  3. Oracle
  4. 创建索引-big.data.analytics.with.spark

创建索引-big.data.analytics.with.spark

上传者: 2024-07-12 18:46:47上传 PDF文件 31.31MB 热度 8次

16.4、使用索引的原则

  • 查询结果是所有数据行的5%以下时,使用index查询效果最好。
  • where条件中经常用到表的多列时,使用复合索引效果会好于几个单列索引。因为当sql语句所查询的列,全部都出现在复合索引中时,此时由于Oracle只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多。
  • 索引利于select,但对经常insert,delete尤其update的表,会降低效率。

例如,试比较下面两条SQL语句(emp表的deptno列上建有ununique index):

语句A:

SELECT dname, deptno FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp);

语句B:

SELECT dname, deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);

这两条查询语句实现的结果是相同的,但是执行语句A的时候,ORACLE会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引。执行语句B的时候,由于在子查询中使用了联合查询,ORACLE只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的效率高。

  • where子句中的这个字段,必须是复合索引的第一个字段。例如,一个索引是按f1, f2, f3的次序建立的,若where子句是f2 = : var2,则因为f2不是索引的第1个字段,无法使用该索引。
  • where子句中的这个字段,不应该参与任何形式的计算:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
  • 应尽量熟悉各种操作符对Oracle是否使用索引的影响:以下这些操作会显式(explicitly)地阻止Oracle使用索引:is null, is not null, not in, !=, like, numeric_col+0, date_col+0, char_col||' ', to_char, to_number, to_date等。例如:
Select jobid from mytabs where isReq='0' and to_date (update) >= to_Date ( '2001-7-18', 'YYYY-MM-DD');

在这种情况下,update列的索引也不会生效。

16.4、创建索引

create index abc on student(sid, sname);
create index abc1 on student(sname, sid);

这两种索引方式是不一样的。索引abc对如下查询语句更有效:

Select * from student where sid=1;

索引abc1对如下查询语句更有效:

Select * from student where sname='louis';

因此建立索引的时候,字段的组合顺序是非常重要的。一般情况下,需要经常访问的字段放在组合字段的前面。

用户评论