Oracle还是比较常用的,于是我研究了一下Oracle INDEX提示,当使用hints时,在某些情况下,为了确保让优化器产生***的执行计划,我们可能指定全套的hints,在这里拿出来和大家分享一下,希望对大家有用。
例如,如果有一个复杂的查询,包含多个表连接,如果你只为某个表指定了Oracle INDEX提示(指示存取路径在该表上使用索引),优化器需要来决定其它应该使用的访问路径和相应的连接方法。因此,即使你给出了一个Oracle INDEX提示,优化器可能觉得没有必要使用该提示。这是由于我们让优化器选择了其它连接方法和存取路径,而基于这些连接方法和存取路径,优化器认为用户给出的Oracle INDEX提示无用。为了防止这种情况,我们要使用全套的hints,如:不但指定要使用的索引,而且也指定连接的方法与连接的顺序等。
下面是一个使用全套hints的例子,ORDERED提示指出了连接的顺序,而且为不同的表指定了连接方法:
SELECT/*+ORDEREDINDEX(b,jl_br_balances_n1)USE_NL(jb) USE_NL(glccglf)USE_MERGE(gpgsb)*/ b.application_id,b.set_of_books_id, b.personnel_id,p.vendor_idPersonnel, p.segment1PersonnelNumber,p.vendor_nameName FROMjl_br_journalsj,jl_br_balancesb, gl_code_combinationsglcc,fnd_flex_values_vlglf, gl_periodsgp,gl_sets_of_booksgsb,po_vendorsp WHERE...
指示优化器的方法与目标的hints:
ALL_ROWS--基于代价的优化器,以吞吐量为目标 FIRST_ROWS(n)--基于代价的优化器,以响应时间为目标 CHOOSE--根据是否有统计信息,选择不同的优化器 RULE--使用基于规则的优化器
例子:
SELECT/*+FIRST_ROWS(10)*/employee_id,last_name,salary,job_id FROMemployees WHEREdepartment_id=20; SELECT/*+CHOOSE*/employee_id,last_name,salary,job_id FROMemployees WHEREemployee_id=7566; SELECT/*+RULE*/employee_id,last_name,salary,job_id FROMemployees WHEREemployee_id=7566;
【编辑推荐】
- 讨论Oracle文档学习经验如何了解Oracle生成执行计划详细谈论Oracle表连接分析Oracle索引扫描四大类高手闲谈Oracle索引扫描