要求:
请将文本信息调整为易于阅读的Markdown排版,同时保持内容和标题不变,内容中请勿使用标题标签(如#、##、###、H1、H2、H3),中文或者通顺的中英文回复我。
请清理掉图片和链接,保留文本内容。
回复格式:
1.需要回复的字段“title、content、summary、tag”
2. “tag”需要使用逗号分割。
请按照以下回复格式(json):
{\"title\": \"您的回复标题\", \"content\": \"您的回复内容\", \"summary\": \"您的回复摘要\", \"tag\": \"您的标签\"}
内容:
16.4、使用索引的原则--查询结果是所有数据行的5%以下时,使用index查询效果最好; --where条件中经常用到表的多列时,使用复合索引效果会好于几个单列索引。因为当sql语句所查询的列,全部都出现在复合索引中时,此时由于Oracle只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多; --索引利于select,但对经常insert,delte尤其update的表,会降低效率。
eg:试比较下面两条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子句中的这个字段,必须是复合索引的第一个字段;
eg:一个索引是按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等。
eg: 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‟;这样的查询语句更有效
因此建立索引的时候,字段的组合顺序是非常重要的。一般情况下,需要经常访问的字段放在组合字段的前面
暂无评论