ORACLE的HINT详解ITeye - 亚美娱乐

ORACLE的HINT详解ITeye

2019年03月26日10时28分40秒 | 作者: 昭樨 | 标签: 方法,扫描,优化 | 浏览: 563

hints是oracle供给的一种机制,用来通知优化器依照咱们的通知它的方法生成履行计划。咱们能够用hints来完成: 1) 运用的优化器的类型 2) 依据价值的优化器的优化方针,是all_rows仍是first_rows。 3) 表的拜访途径,是全表扫描,仍是索引扫描,仍是直接运用rowid。 4) 表之间的衔接类型 5) 表之间的衔接次第 6) 句子的并行程度 2、HINT能够依据以下规矩发生效果 表衔接的次第、表衔接的方法、拜访途径、并行度 3、HINT运用规模 dml句子 查询句子 4、语法 {DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */ {DELETE|INSERT|SELECT|UPDATE} + hint [text] [hint[text]]... 假如语(句)法不对,则ORACLE会主动疏忽所写的HINT,不报错 1. /*+ALL_ROWS*/ 标明对句子块挑选依据开支的优化方法,并取得最佳吞吐量,使资源耗费最小化. SELECT /*+ALL_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=SCOTT; 2. /*+FIRST_ROWS*/ 标明对句子块挑选依据开支的优化方法,并取得最佳呼应时刻,使资源耗费最小化. SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=SCOTT; 3. /*+CHOOSE*/ 标明假如数据字典中有拜访表的计算信息,将依据开支的优化方法,并取得最佳的吞吐量; 标明假如数据字典中没有拜访表的计算信息,将依据规矩开支的优化方法; SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=SCOTT; 4. /*+RULE*/ 标明对句子块挑选依据规矩的优化方法. SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=SCOTT; 5. /*+FULL(TABLE)*/ 标明对表挑选大局扫描的方法. SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO=SCOTT; 6. /*+ROWID(TABLE)*/ 提示清晰标明对指定表依据ROWID进行拜访. SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID =AAAAAAAAAAAAAA AND EMP_NO=SCOTT; 7. /*+CLUSTER(TABLE)*/ 提示清晰标明对指定表挑选簇扫描的拜访方法,它只对簇目标有用. SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS WHERE DPT_NO=TEC304 AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 8. /*+INDEX(TABLE INDEX_NAME)*/ 标明对表挑选索引的扫描方法. SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX=M; 9. /*+INDEX_ASC(TABLE INDEX_NAME)*/ 标明对表挑选索引升序的扫描方法. SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO=SCOTT; 10. /*+INDEX_COMBINE*/ 为指定表挑选位图拜访路经,假如INDEX_COMBINE中没有供给作为参数的索引,将挑选出位图索引的布尔组合方法. SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS WHERE SAL 5000000 AND HIREDATE 11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/ 提示清晰指令优化器运用索引作为拜访途径. SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE FROM BSEMPMS WHERE SAL 60000; 12. /*+INDEX_DESC(TABLE INDEX_NAME)*/ 标明对表挑选索引降序的扫描方法. SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO=SCOTT; 13. /*+INDEX_FFS(TABLE INDEX_NAME)*/ 对指定的表履行快速全索引扫描,而不是全表扫描的方法. SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO=TEC305; 14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/ 提示清晰进行履行规划的挑选,将几个单列索引的扫描合起来. SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO=SCOTT AND DPT_NO=TDC306; 15. /*+USE_CONCAT*/ 对查询中的WHERE后边的OR条件进行转换为UNION ALL的组合查询. SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO=TDC506 AND SEX=M; 16. /*+NO_EXPAND*/ 关于WHERE后边的OR 或许IN-LIST的查询句子,NO_EXPAND将阻挠其依据优化器对其进行扩展. SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO=TDC506 AND SEX=M; 17. /*+NOWRITE*/ 制止对查询块的查询重写操作. 18. /*+REWRITE*/ 能够将视图作为参数. 19. /*+MERGE(TABLE)*/ 能够对视图的各个查询进行相应的兼并. SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO ,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL V.AVG_SAL; 20. /*+NO_MERGE(TABLE)*/ 关于有可兼并的视图不再兼并. SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL V.AVG_SAL; 21. /*+ORDERED*/ 依据表出现在FROM中的次第,ORDERED使ORACLE依此次第对其衔接. SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1; 22. /*+USE_NL(TABLE)*/ 将指定表与嵌套的衔接的行源进行衔接,并把指定表作为内部表. SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 23. /*+USE_MERGE(TABLE)*/ 将指定的表与其他行源经过兼并排序衔接方法衔接起来. SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 24. /*+USE_HASH(TABLE)*/ 将指定的表与其他行源经过哈希衔接方法衔接起来. SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 25. /*+DRIVING_SITE(TABLE)*/ 强制与ORACLE所挑选的方位不同的表进行查询履行. SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO; 26. /*+LEADING(TABLE)*/ 将指定的表作为衔接次第中的首表. 27. /*+CACHE(TABLE)*/ 当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近运用端 SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS; 28. /*+NOCACHE(TABLE)*/ 当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近运用端 SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS; 29. /*+APPEND*/ 直接刺进到表的最终,能够进步速度. insert /*+append*/ into test1 select * from test4 ; 30. /*+NOAPPEND*/ 经过在刺进句子生计期内中止并行形式来发动惯例刺进. insert /*+noappend*/ into test1 select * from test4 ; 31. NO_INDEX: 指定不运用哪些索引 /*+ NO_INDEX ( table [index [index]...] ) */ select /*+ no_index(emp ind_emp_sal ind_emp_deptno)*/ * from emp where deptno=200 and sal 32. parallel select /*+ parallel(emp,4)*/ * from emp where deptno=200 and sal 另:每个SELECT/INSERT/UPDATE/DELETE指令后只能有一个/*+ */,但提示内容能够有多个,能够用逗号分隔,空格也能够。 如:/*+ ordered index() use_nl() */ - 相似如下的一条句子:insert into xxxx select /*+parallel(a) */ * from xxx a;数据量大约在75G左右,这位兄弟从上午跑到下午还没跑完,过来问我咋回事,说往常2hrs能跑完的东西跑了好几个小时还撒动态。检查体系功能也比较 正常,cpu,io都不繁忙,均匀READ速度在80M/s左右(牵强将就),但均匀写速度只要10M不到。等候事情里边很多的‘ ‘PX Deq Credit: send blkd’,这里能看出并行出了问题,然后最终得知是并行用法有问题,修正之后20分钟完成了该操作。正确的做法应该是: alter session enable dml parallel; insert /*+parallel(xxxx,4) */ into xxxx select /*+parallel(a) */ * from xxx a; 由于oracle默许并不会翻开PDML,对DML句子有必要手艺启用。 别的不得不说的是,并行不是一个可扩展的特性,只要在数据仓库或作为DBA等少数人的东西在批量数据操作时利于充分运用资源,而在OLTP环境下运用并行 需求十分慎重。事实上PDML仍是有比较多的束缚的,例如不支持触发器,引证束缚,高档仿制和分布式业务等特性,一起也会带来额定的空间占用,PDDL同 样是如此。有关Parallel excution可参阅官方文档,在Thomas Kyte的新书《Expert Oracle Database architecture》也有精辟的叙述。 - select count(*) From wid_serv_prod_mon_1100 a where a.acct_month = 201010 and a.partition_id = 10 and serv_state not in (2HB, 2HL, 2HJ, 2HP, 2HF) and online_flag in (0) and incr_product_id in (2000020) and product_id in (2020966, 2020972, 2100297, 2021116) and billing_mode_id = 1 and exp_date to_date(201010, yyyymm) and not exists (select /*+no_index (b IDX_W_CDR_MON_SERV_ID_1100)*/ from wid_cdr_mon_1100 b where b.acct_month = 201010 and b.ANA_EVENT_TYPE_4 in (10201010201, 10202010201, 10203010201, 10203010202, 10203030201, 10203030202, 10204010201, 10204010202, 10204030201) and a.serv_id = b.serv_id)
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表亚美娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章