
在日常工作中,
我们经常会遇到SQL执行缓慢的情况,
一般来说,
是该条SQL本身执行效率差。
但是也会有部分SQL看起来已经采用各种索引查、分区查、还是执行的异常缓慢。
这时候该怎么办呢?
这时,我们查看该SQL的执行计划,发现Oracle会选择了很差的执行计划,导致某个语句执行的异常缓慢。
这往往是因为数据库的各项参数是服务于日常业务的,Oracle为了平衡I/O资源的消耗,可能会选择一些很傻的方式去执行某条统计SQL。这个时候我们就要用一种很『暴力』的方法。
告诉优化器使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。而Hint就是Oracle提供的一种机制,用来告诉优化器按照给定的方式生成执行计划。
关于Hint
Hint是Oracle中一种特殊的注释,必须紧跟着DELETE、INSERT、UPDATE或MERGE关键字。不能像普通注释那样在SQL语句中随处添加。且在注释分隔符之后的第一个字符必须是加号。
下图是同业对标指标程序中的一个Hint的实际应用范例:
👇
在该指标抽取的场景中,SG_A_RCVBL_FLOW是一个DBLIK至其他库的同义词,且该表数据量巨大,K_DIM_RELA是本库的一个单位配置表,数据量相对小。
此时我们使用到了第一个
Hint “/*+DRIVING_SITE(table_name)*/” ,
oracle将会从单位配置表获取全部数据到数据量大的表所在的数据库来进行关联运算,增加了执行效率。
在使用该条hint时要注意,如果main为大表,minor为另一库中较小的表时:
当指定 /*+driving_site(main)*/ 时,
oracle将会从minor表获取全部数据到main表所在的数据库来进行关联运算.(索引起作用,速度快)
若指定 /*+driving_site(minor)*/ 时,
oracle将会从main表获取全部数据到minor表所在的数据库来进行关联运算.(索引失败,全表扫描)。
—— 所以在日常应用中要注意Hint中参数的填写!
介绍完了一个Hint的使用,我们来讲下一个
👇
上图图也是节选自同业对标指标程序,可以看到有一条:
/*+PARALLEL(TABLE_NAME NUMBER)*/,
该hint的作用是通知Oracle采用并行的方式执行该条SQL,其中number这个参数是并行度,取决于服务器cpu的数量。
使用该条hint虽然可以提升SQL执行效率,但相应的也要更消耗数据库资源,增加服务器负载。
所以在使用该条Hint时要注意:
1.被查询的表数据量很大,超过一千万;
2.数据库主机是多个CPU;
3.系统的当前负载较低;
4.需要全表扫的场景
今天先介绍这两条较常用Hint的用法,
但是当遇到SQL执行计划较差的情况,
应优先考虑尝试优化SQL语句,
增加索引、分区等常规优化方式,
而不是直接加Hint了事。
毕竟Hint只是一种比较简单粗暴的方法,
并不具有代码应有的美感。
• end •
By 国网总部业务部 | 黄迪
Hello,同学们
以上就是本期微课堂内容
如果你在实际工作中也有些小发现、小心得
这里永远是你展现自我、收获积分的平台
只要你愿意分享
随时随地均可投稿至
family@longshine.com
欢迎来稿~
目前朗小新、小云筑等人表示有意愿

