[20220309]完善shp4.sql脚本.txt --//昨天看了以前写的shp4.sql脚本,发现写的不好,不能充分利用索引,重新改写一个新版本: 1.环境: SYS@book> @ver1 PORT_STRING VERSION BANNER ------------------------------ -------------- -------------------------------------------------------------------------------- x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production SYS@book> select * from V$INDEXED_FIXED_COLUMN where table_name='X$KGLOB' order by 2 ; TABLE_NAME INDEX_NUMBER COLUMN_NAME COLUMN_POSITION ---------- ------------ -------------------- --------------- X$KGLOB 1 KGLNAHSH 0 X$KGLOB 2 KGLOBT03 0 --//修改如下: $ cat shp4x.sql column N0_6_16 format 99999999 SELECT DECODE (kglhdadr, kglhdpar, 'parent handle address', 'child handle address') text, kglhdadr, kglhdpar, substr(kglnaobj,1,40) c40, KGLHDLMD, KGLHDPMD, kglhdivc, kglobhd0, kglobhd6, kglobhs0,kglobhs6,kglobt16, kglobhs0+kglobhs6+kglobt16 N0_6_16, kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6+kglobt16 N20, kglnahsh, kglobt03, kglobt09 FROM x$kglob WHERE kglobt03 = '&1' or KGLNAHSH= &2; --//我以前写的查询条件是 WHERE kglobt03 = '&1' or kglhdpar='&1' or kglhdadr='&1' or KGLNAHSH= &2;,这样测试环境没什么, --//但是到了生产系统很慢,并且很容易遭遇ora-00600错误。 2.测试: SYS@book> select sysdate from dual; SYSDATE ------------------- 2022-03-09 08:32:13 SYS@book> @ hash HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX SQL_EXEC_START SQL_EXEC_ID ---------- ------------- ------------ ---------- --------------- ---------- ------------------- ----------- 2343063137 7h35uxf5uhmm1 0 20065 1388734953 8ba84e61 2022-03-09 08:32:13 16777218 SYS@book> @ sharepool/shp4x 7h35uxf5uhmm1 0 TEXT KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 --------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- child handle address 000000007D7887D8 000000007C79E448 select sysdate from dual 0 0 0 000000007CC7EFA0 000000007D2FCA48 4528 8088 3081 15697 15697 2343063137 7h35uxf5uhmm1 0 parent handle address 000000007C79E448 000000007C79E448 select sysdate from dual 0 0 0 000000007BE75BE0 00 4720 0 0 4720 4720 2343063137 7h35uxf5uhmm1 65535 SYS@book> @ dpc '' '' '' PLAN_TABLE_OUTPUT ------------------------------------- SQL_ID 352c9tf8hy2nw, child number 0 ------------------------------------- SELECT DECODE (kglhdadr, kglhdpar, 'parent handle address', 'child handle address') text, kglhdadr, kglhdpar, substr(kglnaobj,1,40) c40, KGLHDLMD, KGLHDPMD, kglhdivc, kglobhd0, kglobhd6, kglobhs0,kglobhs6,kglobt16, kglobhs0+kglobhs6+kglobt16 N0_6_16, kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglob hs6+kglobt16 N20, kglnahsh, kglobt03, kglobt09 FROM x$kglob WHERE kglobt03 = '7h35uxf5uhmm1' or KGLNAHSH= 0 Plan hash value: 4104444136 ------------------------------------------------------------------ | Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| ------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 1 (100)| |* 1 | FIXED TABLE FULL| X$KGLOB | 8 | 1536 | 0 (0)| ------------------------------------------------------------------ Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$1 / X$KGLOB@SEL$1 Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(("KGLOBT03"='7h35uxf5uhmm1' OR "KGLNAHSH"=0)) --//虽然两个索引都存在,但是oracle选择全表扫描,在测试环境没有问题,如果生产系统共享内存很大的情况下,很慢并且容易出现ora-00600之类的错误。 --//加入提示看看。 $ cat shp4x.sql column N0_6_16 format 99999999 SELECT /*+ USE_CONCAT(@"SEL$1" 8 OR_PREDICATES(1)) */ DECODE (kglhdadr, kglhdpar, 'parent handle address', 'child handle address') text, kglhdadr, kglhdpar, substr(kglnaobj,1,40) c40, KGLHDLMD, KGLHDPMD, kglhdivc, kglobhd0, kglobhd6, kglobhs0,kglobhs6,kglobt16, kglobhs0+kglobhs6+kglobt16 N0_6_16, kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6+kglobt16 N20, kglnahsh, kglobt03, kglobt09 FROM x$kglob WHERE kglobt03 = '&1' or KGLNAHSH= &2; --//注:加入use_concat无效。 SYS@book> @ sharepool/shp4x 7h35uxf5uhmm1 0 TEXT KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 --------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- child handle address 000000007D7887D8 000000007C79E448 select sysdate from dual 0 0 0 000000007CC7EFA0 000000007D2FCA48 4528 8088 3081 15697 15697 2343063137 7h35uxf5uhmm1 0 parent handle address 000000007C79E448 000000007C79E448 select sysdate from dual 0 0 0 000000007BE75BE0 00 4720 0 0 4720 4720 2343063137 7h35uxf5uhmm1 65535 SYS@book> @ dpc '' '' '' PLAN_TABLE_OUTPUT ------------------------------------- SQL_ID 4q21f8mg38n11, child number 0 ------------------------------------- SELECT /*+ USE_CONCAT(@"SEL$1" 8 OR_PREDICATES(1)) */ DECODE (kglhdadr, kglhdpar, 'parent handle address', 'child handle address') text, kglhdadr, kglhdpar, substr(kglnaobj,1,40) c40, KGLHDLMD, KGLHDPMD, kglhdivc, kglobhd0, kglobhd6, kglobhs0,kglobhs6,kglobt16, kglobhs0+kglobhs6+kglobt16 N0_6_16, kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6+kglobt16 N20, kglnahsh, kglobt03, kglobt09 FROM x$kglob WHERE kglobt03 = '7h35uxf5uhmm1' or KGLNAHSH= 0 Plan hash value: 453496081 ---------------------------------------------------------------------------------- | Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| ---------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 1 (100)| | 1 | CONCATENATION | | | | | |* 2 | FIXED TABLE FIXED INDEX| X$KGLOB (ind:1) | 1 | 178 | 0 (0)| |* 3 | FIXED TABLE FIXED INDEX| X$KGLOB (ind:2) | 8 | 1424 | 0 (0)| ---------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$1 2 - SEL$1_1 / X$KGLOB@SEL$1 3 - SEL$1_2 / X$KGLOB@SEL$1_2 Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("KGLNAHSH"=0) 3 - filter(("KGLOBT03"='7h35uxf5uhmm1' AND LNNVL("KGLNAHSH"=0))) Note ----- - Warning: basic plan statistics not available. These are only collected when: * hint 'gather_plan_statistics' is used for the statement or * parameter 'statistics_level' is set to 'ALL', at session or system level 42 rows selected. --//这样的查询可以充分利用索引,对于大的共享内存执行更加,也不容易出现ora-00600之类的错误.
[20220309]完善shp4.sql脚本.txt
来源:这里教程网
时间:2026-03-03 17:30:05
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 【TABLESPACE】Oracle 表空间结构说明
【TABLESPACE】Oracle 表空间结构说明
26-03-03 - About the Oracle GoldenGate Trail
About the Oracle GoldenGate Trail
26-03-03 - 19c RAC 双实例
19c RAC 双实例
26-03-03 - Oracle ADG 自动切换脚本分享
Oracle ADG 自动切换脚本分享
26-03-03 - 【UP_ORACLE】能够升级到Oracle 19c的数据库版本清单
【UP_ORACLE】能够升级到Oracle 19c的数据库版本清单
26-03-03 - Release Schedule of Current Database Releases (Doc ID 742060.1)
- Oracle 架构汇总
Oracle 架构汇总
26-03-03 - 盖世无双之国产数据库风云榜-2022年02月
盖世无双之国产数据库风云榜-2022年02月
26-03-03 - db file sequential read
db file sequential read
26-03-03 - Oracle ADG 备库添加备库
Oracle ADG 备库添加备库
26-03-03
