ORACLE_SQL性能优化题库.ppt

使用全套的hints: 当使用hints时,在某些情况下,为了确保让优化器产生最优的执行计划,我们可能指定全套的hints。例如,如果有一个复杂的查询,包含多个表连接,如果你只为某个表指定了INDEX提示(指示存取路径在该表上使用索引),优化器需要来决定其它应该使用的访问路径和相应的连接方法。因此,即使你给出了一个INDEX提示,优化器可能觉得没有必要使用该提示。这是由于我们让优化器选择了其它连接方法和存取路径,而基于这些连接方法和存取路径,优化器认为用户给出的INDEX提示无用。为了防止这种情况,我们要使用全套的hints,如:不但指定要使用的索引,而且也指定连接的方法与连接的顺序等。 下面是一个使用全套hints的例子,ORDERED提示指出了连接的顺序,而且为不同的表指定了连接方法: SELECT /*+ ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) USE_NL (glcc glf) USE_MERGE (gp gsb) */ b.application_id, b.set_of_books_id , b.personnel_id, p.vendor_id Personnel, p.segment1 PersonnelNumber, p.vendor_name Name FROM jl_br_journals j, jl_br_balances b, gl_code_combinations glcc, fnd_flex_values_vl glf, gl_periods gp, gl_sets_of_books gsb, po_vendors p WHERE ... 如何干预执行计划 指示优化器的方法与目标的hints: ALL_ROWS -- 基于代价的优化器,以吞吐量为目标 FIRST_ROWS(n) -- 基于代价的优化器,以响应时间为目标 CHOOSE -- 根据是否有统计信息,选择不同的优化器 RULE -- 使用基于规则的优化器 例子: SELECT /*+ FIRST_ROWS(10) */ employee_id, last_name, salary, job_id FROM employees WHERE department_id = 20; SELECT /*+ CHOOSE */ employee_id, last_name, salary, job_id FROM employees WHERE employee_id = 7566; SELECT /*+ RULE */ employee_id, last_name, salary, job_id FROM employees WHERE employee_id = 7566; 如何干预执行计划 指示存储路径的hints: FULL /*+ FULL ( table ) */ 指定该表使用全表扫描 ROWID /*+ ROWID ( table ) */ 指定对该表使用rowid存取方法,该提示用的较少 INDEX /*+ INDEX ( table [index]) */ 使用该表上指定的索引对表进行索引扫描 INDEX_FFS /*+ INDEX_FFS ( table [index]) */ 使用快速全表扫描 NO_INDEX /*+ NO_INDEX ( table [index]) */ 不使用该表上指定的索引进行存取,仍然可以使用其它的索引进行索引扫描 SELECT /*+ FULL(e) */ employee_id, last_name FROM employees e WHERE last_name LIKE :b1; SELECT /*+ROWID(employees)*/ * FROM employees WHERE rowid AAAAtkAABAAAFNTAAA AND employee_id = 155; SELECT /*+ INDEX(A sex_index) use sex_index because there are few male patients */ A.name, A.height, A.weight FROM patients A WHERE A.sex = ’m’; SELECT /*+NO_INDEX(employees emp_empid)*/ employee_id FROM employees WHERE employee_id 200; 如何干预执行计划 指示连接顺序的hints: ORDERED /*+ ORD

文档评论(0)

1亿VIP精品文档

相关文档