Sql优化(五) hint(提示)介绍

上篇介绍了oracle优化器。尽管oracle优化器很智能,但有时候你想自己选择执行计划,可以通过hint实现。在开发测试环境中,可以通过hint测试不同执行计划的性能。Hint的缺点是增加了管理代码的额外负担,当数据库或环境发生变化时,如果不修改hint,可能导致性能下降。例如,代码中用hint指定索引,但重建索引时索引名变化。

因此oracle建议使用hint测试性能后,用其他工具来管理执行计划,如oracle 10g以后的sql tuning advisorsql plan baseline。但hint仍旧是很常用的优化手段,特别是有些动态sql,表名不固定,就无法使用sql plan等工具,此时需要hint来大显身手。

[@more@]

(一) 类别

类型

hint

optimization goals

ALL_ROWS,FIRST_ROWS(n)

Access paths

Full,hash,index,no_index,cluster

Join orders

Leading(oracle推荐,更通用)

Ordered(按语句中出现次序)

Join operations

USE_NL and NO_USE_NL

USE_MERGE and NO_USE_MERGE

USE_HASH and NO_USE_HASH

Parallel

Parallel and no_parallel

Parallel_indexno_parallel_index

Query transformation

No_query_transformation,Use_concat

No_expand,Rewrite and no_rewrite

其他

APPENDCACHE,DRIVING_SITE

说明

Use_nl (a b c d)USE_NL(a ,b,c,d)两种写法都可以

USE_NL可以和LEADING组合使用

SELECT /*+ USE_NL(d ,a ,b ,c) leading(d ,a ,b ,c) */

(二) Hint使用举例

1. 通过hint指定访问路径和并发

create table table_back as

select /*+ PARALLEL(p,8) */ * from pro_chr_map p where parent_account_no+0 =56719189;

pro_cdr_map有上千万记录,该帐号的记录就占了30%,访问索引反而慢,因此选择全表扫描,并使用并发。

Parent_account_no+0使不走索引,也可通过hint实现:

select /*+ full(p) PARALLEL(p,8) */ * from pro_chr_map p where parent_account_no+0 =56719189;

2. Hints for join operation一例

SQL> set autotrace on

写法一:不使用hintoracle优化器选择HASH JOIN

SQL> select count(*)

from PRINT_INVOICE_PO a

where exists (select 1 from print_cdr_data b

where b.account_internal_id = a.account_no

and b.trans_date < a.from_date - 5)

and a.task_sn = 'test_3398'

and a.bill_ref_no >= 181992967766

and a.bill_ref_no <= 181993099582; 2 3 4 5 6 7 8

COUNT(*)

----------

0

Elapsed: 00:02:36.49

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=77535 Card=1 Bytes=5

3)

1 0 SORT (AGGREGATE)

2 1 HASH JOIN (SEMI) (Cost=77535 Card=75 Bytes=3975)

3 2 TABLE ACCESS (BY INDEX ROWID) OF 'PRINT_INVOICE_PO' (C

ost=15862 Card=1495 Bytes=55315)

4 3 INDEX (RANGE SCAN) OF 'IDX_TASK_SN_PO' (NON-UNIQUE)

(Cost=1489 Card=598110)

5 2 INDEX (FAST FULL SCAN) OF 'INDEX_PRINT_CDR2' (NON-UNIQ

UE) (Cost=59870 Card=120489550 Bytes=1927832800)

写法二:用hint指定nested loop join

SQL> select COUNT(*)

from nprint.PRINT_INVOICE_PO a

where exists (select /*+ NL_SJ */ 1 from print_cdr_data b

where b.account_internal_id = a.account_no

and b.trans_date < a.from_date - 5)

and a.task_sn = 'test_3398'

and a.bill_ref_no >= 181992967766

and a.bill_ref_no <= 181993099582;

2 3 4 5 6 7 8

COUNT(*)

----------

0

Elapsed: 00:00:01.38

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2735267 Card=1 Bytes

=53)

1 0 SORT (AGGREGATE)

2 1 NESTED LOOPS (SEMI) (Cost=2735267 Card=75 Bytes=3975)

3 2 TABLE ACCESS (BY INDEX ROWID) OF 'PRINT_INVOICE_PO' (C

ost=15862 Card=1495 Bytes=55315)

4 3 INDEX (RANGE SCAN) OF 'IDX_TASK_SN_PO' (NON-UNIQUE)

(Cost=1489 Card=598110)

5 2 TABLE ACCESS (BY INDEX ROWID) OF 'PRINT_CDR_DATA' (Cos

t=1819 Card=6024478 Bytes=96391648)

6 5 INDEX (RANGE SCAN) OF 'IDX_ACCOUNT_INTERNAL_ID' (NON

-UNIQUE) (Cost=8 Card=203)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18474/viewspace-1060732/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/18474/viewspace-1060732/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle SQL优化是指通过调整SQL查询语句和数据库结构,以提高查询性能和响应时间的过程。下面是一些常用的Oracle SQL优化技巧: 1. 使用合适的索引:确保表中的列上有适当的索引,以加快查询速度。可以使用EXPLAIN PLAN或者SQL Tuning Advisor来分析查询计划,并建议适当的索引。 2. 编高效的查询语句:尽量避免使用SELECT *,只选择需要的列;使用合适的JOIN语句,避免不必要的连接;使用WHERE子句限制返回的行数。 3. 使用合适的数据类型:选择合适的数据类型可以减少存储空间和加速查询。例如,使用整数类型代替字符类型存储数字数据。 4. 避免使用函数和表达式:在WHERE子句中使用函数或表达式会导致索引失效,影响查询性能。尽量将函数和表达式移到SELECT列表之外。 5. 分析统计信息:确保收集和更新表和索引的统计信息,以便优化查询计划的生成。可以使用DBMS_STATS包来收集统计信息。 6. 优化连接操作:对于复杂的连接操作,可以考虑使用合适的连接方式(如HASH JOIN、NESTED LOOP等),以及使用连接池和缓存来提高性能。 7. 使用分区表:对于大型表,可以考虑使用分区表来提高查询性能。分区可以根据特定的列值将数据划分为更小的块,使查询更加高效。 8. 避免全表扫描:尽量避免全表扫描操作,可以通过合理使用索引、分区表等技术来避免全表扫描,以提高查询性能。 9. 使用Hint提示:可以使用查询提示(Hint)来指导优化器生成最优的执行计划。但是需要谨慎使用,因为错误的Hint可能导致性能下降。 10. 监视和调整数据库参数:根据实际情况,监视和调整数据库参数,以优化整体数据库性能。 综上所述,Oracle SQL优化需要综合考虑查询语句、索引、表结构、统计信息等多个方面的因素。通过合理的优化策略,可以提高查询性能和响应时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值