一次访问Oracle数据字典的优化
一次访问Oracle数据字典的优化
推荐阅读:DBA任务---确保统计信息准确性
今晚上有位哥们QQ问我有没有什么SQL脚本用来收集统计信息的 几乎未加思考我就把上面的脚本原封不动的贴个了那位哥们
后来那位哥们改写了SQL,说下面的SQL要跑200多秒,7千多W的逻辑读
- SELECT OWNER,
- SEGMENT_NAME,
- CASE
- WHEN SIZE_GB < 0.5 THEN
- 30
- WHEN SIZE_GB >= 0.5 AND SIZE_GB < 1 THEN
- 20
- WHEN SIZE_GB >= 1 AND SIZE_GB < 5 THEN
- 10
- WHEN SIZE_GB >= 5 AND SIZE_GB < 10 THEN
- 5
- WHEN SIZE_GB >= 10 THEN
- 1
- END AS PERCENT,
- 2 AS DEGREE
- FROM (SELECT OWNER,
- SEGMENT_NAME,
- SUM(BYTES / 1024 / 1024 / 1024) SIZE_GB
- FROM DBA_SEGMENTS A
- WHERE OWNER IN ('DATASYNC_PRC','OSS03','BAS01','DATASYNC_1','DATASYNC_2','OSS_CMS')
- AND SEGMENT_NAME IN
- (SELECT DISTINCT TABLE_NAME
- FROM DBA_TAB_STATISTICS B
- WHERE (LAST_ANALYZED IS NULL OR STALE_STATS = 'YES')
- AND OWNER IN('DATASYNC_PRC','OSS03','BAS01','DATASYNC_1','DATASYNC_2','OSS_CMS'))
- GROUP BY OWNER, SEGMENT_NAME);
该SQL语句执行计划如下:
- SQL> select * from table(dbms_xplan.display);
- PLAN_TABLE_OUTPUT
- ---------------------------------------------------------------------------------------------------------------------------
- --------------------
- Plan hash value: 2028155339
- ----------------------------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- ----------------------------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 22412 | 3852K| 113K (2)| 00:05:55 |
- | 1 | HASH GROUP BY | | 22412 | 3852K| 113K (2)| 00:05:55 |
- |* 2 | FILTER | | | | | |
- | 3 | VIEW | SYS_DBA_SEGS | 2837 | 487K| 110K (2)| 00:05:46 |
- | 4 | UNION-ALL | | | | | |
- | 5 | NESTED LOOPS | | 1840 | 296K| 93690 (2)| 00:04:53 |
- |* 6 | HASH JOIN | | 1779 | 272K| 93690 (2)| 00:04:53 |
- | 7 | TABLE ACCESS FULL | TS$ | 172 | 1548 | 54 (2)| 00:00:01 |
- | 8 | NESTED LOOPS | | 1779 | 257K| 93635 (2)| 00:04:53 |
- |* 9 | HASH JOIN | | 6571 | 757K| 80450 (3)| 00:04:12 |
- |* 10 | FILTER | | | | | |
- |* 11 | HASH JOIN RIGHT OUTER | | 7221 | 423K| 10278 (6)| 00:00:33 |
- | 12 | TABLE ACCESS FULL | USER$ | 3200 | 54400 | 27 (0)| 00:00:01 |
- | 13 | TABLE ACCESS FULL | OBJ$ | 3854K| 158M| 10133 (5)| 00:00:32 |
- | 14 | VIEW | SYS_OBJECTS | 3507K| 194M| 70065 (2)| 00:03:40 |
- | 15 | UNION-ALL | | | | | |
- |* 16 | TABLE ACCESS FULL | TAB$ | 210K| 5548K| 15995 (2)| 00:00:51 |
- | 17 | TABLE ACCESS FULL | TABPART$ | 148K| 2895K| 727 (3)| 00:00:03 |
- | 18 | TABLE ACCESS FULL | CLU$ | 10 | 150 | 14128 (2)| 00:00:45 |
- |* 19 | TABLE ACCESS FULL | IND$ | 750K| 16M| 16045 (2)| 00:00:51 |
- | 20 | TABLE ACCESS FULL | INDPART$ | 620K| 11M| 2424 (4)| 00:00:08 |
- |* 21 | TABLE ACCESS FULL | LOB$ | 2273 | 50006 | 15929 (2)| 00:00:50 |
- | 22 | TABLE ACCESS FULL | TABSUBPART$ | 269K| 5261K| 932 (4)| 00:00:03 |
- | 23 | TABLE ACCESS FULL | INDSUBPART$ | 1503K| 28M| 3868 (5)| 00:00:13 |
- | 24 | TABLE ACCESS FULL | LOBFRAG$ | 2977 | 65494 | 17 (0)| 00:00:01 |
- |* 25 | TABLE ACCESS CLUSTER | SEG$ | 1 | 30 | 2 (0)| 00:00:01 |
- |* 26 | INDEX UNIQUE SCAN | I_FILE#_BLOCK# | 1 | | 1 (0)| 00:00:01 |
- |* 27 | INDEX UNIQUE SCAN | I_FILE2 | 1 | 8 | 0 (0)| 00:00:01 |
- | 28 | NESTED LOOPS | | 1 | 109 | 2274 (1)| 00:00:08 |
- | 29 | NESTED LOOPS | | 1 | 101 | 2274 (1)| 00:00:08 |
- |* 30 | FILTER | | | | | |
- |* 31 | HASH JOIN OUTER | | 1 | 92 | 2273 (1)| 00:00:08 |
- | 32 | NESTED LOOPS | | 568 | 42600 | 2245 (1)| 00:00:08 |
- |* 33 | TABLE ACCESS FULL | UNDO$ | 1116 | 45756 | 5 (0)| 00:00:01 |
- |* 34 | TABLE ACCESS CLUSTER | SEG$ | 1 | 34 | 2 (0)| 00:00:01 |
- |* 35 | INDEX UNIQUE SCAN | I_FILE#_BLOCK# | 1 | | 1 (0)| 00:00:01 |
- | 36 | TABLE ACCESS FULL | USER$ | 3200 | 54400 | 27 (0)| 00:00:01 |
- | 37 | TABLE ACCESS CLUSTER | TS$ | 1 | 9 | 1 (0)| 00:00:01 |
- |* 38 | INDEX UNIQUE SCAN | I_TS# | 1 | | 0 (0)| 00:00:01 |
- |* 39 | INDEX UNIQUE SCAN | I_FILE2 | 1 | 8 | 0 (0)| 00:00:01 |
- |* 40 | HASH JOIN | | 996 | 77688 | 14672 (1)| 00:00:46 |
- | 41 | TABLE ACCESS FULL | TS$ | 172 | 1548 | 54 (2)| 00:00:01 |
- |* 42 | FILTER | | | | | |
- |* 43 | HASH JOIN RIGHT OUTER | | 996 | 68724 | 14618 (1)| 00:00:46 |
- | 44 | TABLE ACCESS FULL | USER$ | 3200 | 54400 | 27 (0)| 00:00:01 |
- | 45 | NESTED LOOPS | | 531K| 26M| 14574 (1)| 00:00:46 |
- | 46 | TABLE ACCESS FULL | FILE$ | 872 | 10464 | 3 (0)| 00:00:01 |
- |* 47 | TABLE ACCESS CLUSTER | SEG$ | 610 | 24400 | 23 (0)| 00:00:01 |
- |* 48 | INDEX RANGE SCAN | I_FILE#_BLOCK# | 1 | | 2 (0)| 00:00:01 |
- | 49 | VIEW | DBA_TAB_STATISTICS | 42 | 1932 | 2828 (6)| 00:00:09 |
- | 50 | UNION-ALL | | | | | |
- |* 51 | FILTER | | | | | |
- | 52 | NESTED LOOPS OUTER | | 1 | 115 | 23 (0)| 00:00:01 |
- | 53 | NESTED LOOPS | | 1 | 97 | 21 (0)| 00:00:01 |
- | 54 | NESTED LOOPS OUTER | | 1 | 74 | 19 (0)| 00:00:01 |
- | 55 | NESTED LOOPS | | 1 | 67 | 19 (0)| 00:00:01 |
- | 56 | INLIST ITERATOR | | | | | |
- | 57 | TABLE ACCESS BY INDEX ROWID | USER$ | 6 | 102 | 7 (0)| 00:00:01 |
- |* 58 | INDEX UNIQUE SCAN | I_USER1 | 6 | | 2 (0)| 00:00:01 |
- |* 59 | INDEX RANGE SCAN | I_OBJ2 | 1 | 50 | 2 (0)| 00:00:01 |
- |* 60 | INDEX UNIQUE SCAN | I_TAB_STATS
- |* 61 | TABLE ACCESS CLUSTER | TAB$ | 1 | 23 | 2 (0)| 00:00:01 |
- |* 62 | INDEX UNIQUE SCAN | I_OBJ# | 1 | | 1 (0)| 00:00:01 |
- | 63 | TABLE ACCESS BY INDEX ROWID | MON_MODS_ALL$ | 1 | 18 | 2 (0)| 00:00:01 |
- |* 64 | INDEX UNIQUE SCAN | I_MON_MODS_ALL
view plaincopy to clipboardprint?
- | 65 | NESTED LOOPS | | 1 | 147 | 775 (6)| 00:00:03 |
- |* 66 | FILTER | | | | | |
- | 67 | NESTED LOOPS OUTER | | 1 | 141 | 773 (6)| 00:00:03 |
- |* 68 | HASH JOIN | | 1 | 123 | 771 (6)| 00:00:03 |
- | 69 | NESTED LOOPS OUTER | | 1 | 65 | 19 (0)| 00:00:01 |
- | 70 | NESTED LOOPS | | 1 | 58 | 19 (0)| 00:00:01 |
- | 71 | INLIST ITERATOR | | | | | |
- | 72 | TABLE ACCESS BY INDEX ROWID | USER$ | 6 | 102 | 7 (0)| 00:00:01 |
- |* 73 | INDEX UNIQUE SCAN | I_USER1 | 6 | | 2 (0)| 00:00:01 |
- |* 74 | INDEX RANGE SCAN | I_OBJ2 | 1 | 41 | 2 (0)| 00:00:01 |
- |* 75 | INDEX UNIQUE SCAN | I_TAB_STATS
- | 76 | VIEW | TABPARTV$ | 148K| 8397K| 747 (6)| 00:00:03 |
- |* 77 | TABLE ACCESS FULL | TABPART$ | 148K| 4632K| 747 (6)| 00:00:03 |
- | 78 | TABLE ACCESS BY INDEX ROWID | MON_MODS_ALL$ | 1 | 18 | 2 (0)| 00:00:01 |
- |* 79 | INDEX UNIQUE SCAN | I_MON_MODS_ALL
- | 80 | TABLE ACCESS CLUSTER | TAB$ | 21 | 126 | 2 (0)| 00:00:01 |
- |* 81 | INDEX UNIQUE SCAN | I_OBJ# | 1 | | 1 (0)| 00:00:01 |
- | 82 | NESTED LOOPS | | 1 | 140 | 737 (4)| 00:00:03 |
- | 83 | NESTED LOOPS | | 1 | 134 | 735 (4)| 00:00:03 |
- | 84 | NESTED LOOPS | | 1 | 117 | 734 (4)| 00:00:03 |
- | 85 | NESTED LOOPS OUTER | | 1 | 76 | 731 (4)| 00:00:03 |
- | 86 | VIEW | TABPARTV$ | 1 | 58 | 729 (4)| 00:00:03 |
- |* 87 | TABLE ACCESS FULL | TABPART$ | 1 | 32 | 729 (4)| 00:00:03 |
- | 88 | TABLE ACCESS BY INDEX ROWID | MON_MODS_ALL$ | 1 | 18 | 2 (0)| 00:00:01 |
- |* 89 | INDEX UNIQUE SCAN | I_MON_MODS_ALL
- |* 90 | TABLE ACCESS BY INDEX ROWID | OBJ$ | 1 | 41 | 3 (0)| 00:00:01 |
- |* 91 | INDEX RANGE SCAN | I_OBJ1 | 1 | | 2 (0)| 00:00:01 |
- |* 92 | TABLE ACCESS CLUSTER | USER$ | 1 | 17 | 1 (0)| 00:00:01 |
- |* 93 | INDEX UNIQUE SCAN | I_USER# | 1 | | 0 (0)| 00:00:01 |
- | 94 | TABLE ACCESS CLUSTER | TAB$ | 21 | 126 | 2 (0)| 00:00:01 |
- |* 95 | INDEX UNIQUE SCAN | I_OBJ# | 1 | | 1 (0)| 00:00:01 |
- | 96 | NESTED LOOPS | | 3 | 360 | 146 (5)| 00:00:01 |
- |* 97 | FILTER | | | | | |
- | 98 | NESTED LOOPS OUTER | | 1 | 114 | 144 (5)| 00:00:01 |
- |* 99 | HASH JOIN | | 1 | 96 | 142 (5)| 00:00:01 |
- | 100 | NESTED LOOPS OUTER | | 1 | 65 | 19 (0)| 00:00:01 |
- | 101 | NESTED LOOPS | | 1 | 58 | 19 (0)| 00:00:01 |
- | 102 | INLIST ITERATOR | | | | | |
- | 103 | TABLE ACCESS BY INDEX ROWID | USER$ | 6 | 102 | 7 (0)| 00:00:01 |
- |*104 | INDEX UNIQUE SCAN | I_USER1 | 6 | | 2 (0)| 00:00:01 |
- |*105 | INDEX RANGE SCAN | I_OBJ2 | 1 | 41 | 2 (0)| 00:00:01 |
- |*106 | INDEX UNIQUE SCAN | I_TAB_STATS
- | 107 | VIEW | TABCOMPARTV$ | 19453 | 588K| 122 (5)| 00:00:01 |
- | 108 | TABLE ACCESS FULL | TABCOMPART$ | 19453 | 398K| 122 (5)| 00:00:01 |
- | 109 | TABLE ACCESS BY INDEX ROWID | MON_MODS_ALL$ | 1 | 18 | 2 (0)| 00:00:01 |
- |*110 | INDEX UNIQUE SCAN | I_MON_MODS_ALL
- | 111 | TABLE ACCESS CLUSTER | TAB$ | 160 | 960 | 2 (0)| 00:00:01 |
- |*112 | INDEX UNIQUE SCAN | I_OBJ# | 1 | | 1 (0)| 00:00:01 |
- | 113 | NESTED LOOPS | | 35 | 5810 | 1146 (8)| 00:00:04 |
- | 114 | NESTED LOOPS OUTER | | 1 | 160 | 1144 (8)| 00:00:04 |
- | 115 | NESTED LOOPS | | 1 | 153 | 1144 (8)| 00:00:04 |
- |*116 | FILTER | | | | | |
- | 117 | NESTED LOOPS OUTER | | 1 | 147 | 1142 (8)| 00:00:04 |
- |*118 | HASH JOIN | | 11 | 1419 | 1120 (8)| 00:00:04 |
- |*119 | HASH JOIN | | 1 | 70 | 142 (5)| 00:00:01 |
- | 120 | NESTED LOOPS | | 1 | 58 | 19 (0)| 00:00:01 |
- | 121 | INLIST ITERATOR | | | | | |
- | 122 | TABLE ACCESS BY INDEX ROWID| USER$ | 6 | 102 | 7 (0)| 00:00:01 |
- |*123 | INDEX UNIQUE SCAN | I_USER1 | 6 | | 2 (0)| 00:00:01 |
- |*124 | INDEX RANGE SCAN | I_OBJ2 | 1 | 41 | 2 (0)| 00:00:01 |
- | 125 | VIEW | TABCOMPARTV$ | 19453 | 227K| 122 (5)| 00:00:01 |
- | 126 | TABLE ACCESS FULL | TABCOMPART$ | 19453 | 227K| 122 (5)| 00:00:01 |
- | 127 | VIEW | TABSUBPARTV$ | 269K| 15M| 969 (8)| 00:00:04 |
- |*128 | TABLE ACCESS FULL | TABSUBPART$ | 269K| 8681K| 969 (8)| 00:00:04 |
- | 129 | TABLE ACCESS BY INDEX ROWID | MON_MODS_ALL$ | 1 | 18 | 2 (0)| 00:00:01 |
- |*130 | INDEX UNIQUE SCAN | I_MON_MODS_ALL
- |*131 | INDEX RANGE SCAN | I_OBJ1 | 1 | 6 | 2 (0)| 00:00:01 |
- |*132 | INDEX UNIQUE SCAN | I_TAB_STATS
- | 133 | TABLE ACCESS CLUSTER | TAB$ | 160 | 960 | 2 (0)| 00:00:01 |
- |*134 | INDEX UNIQUE SCAN | I_OBJ# | 1 | | 1 (0)| 00:00:01 |
- |*135 | FILTER | | | | | |
- |*136 | FILTER | | | | | |
- | 137 | NESTED LOOPS OUTER | | 1 | 51 | 3 (34)| 00:00:01 |
- | 138 | NESTED LOOPS OUTER | | 1 | 36 | 2 (50)| 00:00:01 |
- |*139 | FIXED TABLE FULL | X$KQFTA | 1 | 21 | 1 (100)| 00:00:01 |
- |*140 | TABLE ACCESS BY INDEX ROWID | FIXED_OBJ$ | 1 | 15 | 1 (0)| 00:00:01 |
- |*141 | INDEX UNIQUE SCAN | I_FIXED_OBJ
view plaincopy to clipboardprint?
- | 142 | TABLE ACCESS BY INDEX ROWID | TAB_STATS$ | 1 | 15 | 1 (0)| 00:00:01 |
- |*143 | INDEX UNIQUE SCAN | I_TAB_STATS
- ----------------------------------------------------------------------------------------------------------------
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 2 - filter( EXISTS (SELECT 0 FROM ( (SELECT "U"."NAME" "OWNER","O"."NAME" "TABLE_NAME",NULL
- "PARTITION_NAME",NULL "PARTITION_POSITION",NULL "SUBPARTITION_NAME",NULL
- "SUBPARTITION_POSITION",'TABLE' "OBJECT_TYPE","T"."ROWCNT"
- "NUM_ROWS",DECODE(BITAND("T"."PROPERTY",64),0,"T"."BLKCNT",TO_NUMBER(NULL))
- "BLOCKS",DECODE(BITAND("T"."PROPERTY",64),0,"T"."EMPCNT",TO_NUMBER(NULL))
- "EMPTY_BLOCKS",DECODE(BITAND("T"."PROPERTY",64),0,"T"."AVGSPC",TO_NUMBER(NULL))
- "AVG_SPACE","T"."CHNCNT" "CHAIN_CNT","T"."AVGRLN" "AVG_ROW_LEN","T"."AVGSPC_FLB"
- "AVG_SPACE_FREELIST_BLOCKS",DECODE(BITAND("T"."PROPERTY",64),0,"T"."FLBCNT",TO_NUMBER(NULL))
- "NUM_FREELIST_BLOCKS","TS"."CACHEDBLK" "AVG_CACHED_BLOCKS","TS"."CACHEHIT"
- "AVG_CACHE_HIT_RATIO","T"."SAMPLESIZE" "SAMPLE_SIZE","T"."ANALYZETIME"
- "LAST_ANALYZED",DECODE(BITAND("T"."FLAGS",512),0,'NO','YES')
- "GLOBAL_STATS",DECODE(BITAND("T"."FLAGS",256),0,'NO','YES')
- "USER_STATS",DECODE(BITAND("T"."TRIGFLAG",67108864)+BITAND("T"."TRIGFLAG",134217728),0,NULL,67108864,'DA
- TA',134217728,'CACHE','ALL') "STATTYPE_LOCKED",CASE WHEN "T"."ANALYZETIME" IS NULL THEN NULL WHEN
- ("M"."INSERTS"+"M"."DELETES"+"M"."UPDATES">"T"."ROWCNT"*TO_NUMBER("DBMS_STATS"."GET_PREFS"('STALE_PERCEN
- T',"U"."NAME","O"."NAME"))/100 OR BITAND("M"."FLAGS",1)=1) THEN 'YES' ELSE 'NO' END "STALE_STATS" FROM
- "SYS"."MON_MODS_ALL{1}quot; "M","SYS"."TAB_STATS{1}quot; "TS","SYS"."TAB{1}quot; "T","SYS"."OBJ{1}quot; "O","SYS"."USER
- WHERE ("U"."NAME"='BAS01' OR "U"."NAME"='DATASYNC_1' OR "U"."NAME"='DATASYNC_2' OR
- "U"."NAME"='DATASYNC_PRC' OR "U"."NAME"='OSS03' OR "U"."NAME"='OSS_CMS') AND "O"."NAMESPACE"=1 AND
- "O"."NAME"=:B1 AND "O"."OWNER#"="U"."USER#" AND "O"."SUBNAME" IS NULL AND "O"."REMOTEOWNER" IS NULL AND
- "O"."LINKNAME" IS NULL AND "O"."OBJ#"="T"."OBJ#" AND BITAND("T"."PROPERTY",1)=0 AND
- "O"."OBJ#"="TS"."OBJ#"(+) AND "T"."OBJ#"="M"."OBJ#"(+) AND ("T"."ANALYZETIME" IS NULL OR CASE WHEN
- "T"."ANALYZETIME" IS NULL THEN NULL WHEN ("M"."INSERTS"+"M"."DELETES"+"M"."UPDATES">"T"."ROWCNT"*TO_NUMB
- ER("DBMS_STATS"."GET_PREFS"('STALE_PERCENT',"U"."NAME","O"."NAME"))/100 OR BITAND("M"."FLAGS",1)=1)
- THEN 'YES' ELSE 'NO' END ='YES')) UNION ALL (SELECT "U"."NAME" "OWNER","O"."NAME"
- "TABLE_NAME","O"."SUBNAME" "PARTITION_NAME","TP"."PART#" "PARTITION_POSITION",NULL
- "SUBPARTITION_NAME",NULL "SUBPARTITION_POSITION",'PARTITION' "OBJECT_TYPE","TP"."ROWCNT"
- "NUM_ROWS","TP"."BLKCNT" "BLOCKS","TP"."EMPCNT" "EMPTY_BLOCKS","TP"."AVGSPC" "AVG_SPACE","TP"."CHNCNT"
- "CHAIN_CNT","TP"."AVGRLN" "AVG_ROW_LEN",TO_NUMBER(NULL) "AVG_SPACE_FREELIST_BLOCKS",TO_NUMBER(NULL)
- "NUM_FREELIST_BLOCKS","TS"."CACHEDBLK" "AVG_CACHED_BLOCKS","TS"."CACHEHIT"
- "AVG_CACHE_HIT_RATIO","TP"."SAMPLESIZE" "SAMPLE_SIZE","TP"."ANALYZETIME"
- "LAST_ANALYZED",DECODE(BITAND("TP"."FLAGS",16),0,'NO','YES')
- "GLOBAL_STATS",DECODE(BITAND("TP"."FLAGS",8),0,'NO','YES')
- "USER_STATS",DECODE(DECODE(BITAND("TAB"."TRIGFLAG",67108864)+BITAND("TP"."FLAGS",32),0,0,1)+DECODE(BITAN
- D("TAB"."TRIGFLAG",134217728)+BITAND("TP"."FLAGS",64),0,0,2),0,NULL,1,'DATA',2,'CACHE','ALL')
- "STATTYPE_LOCKED",CASE WHEN "TP"."ANALYZETIME" IS NULL THEN NULL WHEN
- ("M"."INSERTS"+"M"."DELETES"+"M"."UPDATES">"TP"."ROWCNT"*TO_NUMBER("DBMS_STATS"."GET_PREFS"('STALE_PERCE
- NT',"U"."NAME","O"."NAME"))/100 OR BITAND("M"."FLAGS",1)=1) THEN 'YES' ELSE 'NO' END "STALE_STATS"
- FROM "SYS"."MON_MODS_ALL{1}quot; "M","SYS"."TAB{1}quot; "TAB","SYS"."TAB_STATS{1}quot; "TS", (SELECT "OBJ#"
- "OBJ#","DATAOBJ#" "DATAOBJ#","BO#" "BO#",ROW_NUMBER() OVER ( PARTITION BY "BO#" ORDER BY "PART#")
- "PART#","HIBOUNDLEN" "HIBOUNDLEN","HIBOUNDVAL" "HIBOUNDVAL","TS#" "TS#","FILE#" "FILE#","BLOCK#"
- "BLOCK#","PCTFREE{1}quot; "PCTFREE{1}quot;,"PCTUSED{1}quot; "PCTUSED{1}quot;,"INITRANS" "INITRANS","MAXTRANS"
- "MAXTRANS","FLAGS" "FLAGS","ANALYZETIME" "ANALYZETIME","SAMPLESIZE" "SAMPLESIZE","ROWCNT"
- "ROWCNT","BLKCNT" "BLKCNT","EMPCNT" "EMPCNT","AVGSPC" "AVGSPC","CHNCNT" "CHNCNT","AVGRLN"
- "AVGRLN","PART#" "PHYPART#" FROM SYS."TABPART{1}quot; "TABPART{1}quot; WHERE "FILE#">0 AND "BLOCK#">0)
- "TP","SYS"."OBJ{1}quot; "O","SYS"."USER{1}quot; "U" WHERE ("U"."NAME"='BAS01' OR "U"."NAME"='DATAS)
- 6 - access("S"."TS#"="TS"."TS#")
- 9 - access("O"."OBJ#"="SO"."OBJECT_ID" AND "O"."TYPE#"="SO"."OBJECT_TYPE_ID")
- 10 - filter(NVL("U"."NAME",'SYS')='DATASYNC_PRC' OR NVL("U"."NAME",'SYS')='OSS03' OR
- NVL("U"."NAME",'SYS')='BAS01' OR NVL("U"."NAME",'SYS')='DATASYNC_1' OR
- NVL("U"."NAME",'SYS')='DATASYNC_2' OR NVL("U"."NAME",'SYS')='OSS_CMS')
- 11 - access("O"."OWNER#"="U"."USER#"(+))
- 16 - filter(BITAND("T"."PROPERTY",1024)=0)
- 19 - filter("I"."TYPE#"=1 OR "I"."TYPE#"=2 OR "I"."TYPE#"=3 OR "I"."TYPE#"=4 OR "I"."TYPE#"=6 OR
- "I"."TYPE#"=7 OR "I"."TYPE#"=8 OR "I"."TYPE#"=9)
- 21 - filter(BITAND("L"."PROPERTY",64)=0 OR BITAND("L"."PROPERTY",128)=128)
- 25 - filter("S"."TYPE#"="SO"."SEGMENT_TYPE_ID")
- 26 - access("S"."TS#"="SO"."TS_NUMBER" AND "S"."FILE#"="SO"."HEADER_FILE" AND
- "S"."BLOCK#"="SO"."HEADER_BLOCK")
- 27 - access("S"."TS#"="F"."TS#" AND "S"."FILE#"="F"."RELFILE#")
- 30 - filter(NVL("U"."NAME",'SYS')='DATASYNC_PRC' OR NVL("U"."NAME",'SYS')='OSS03' OR
- NVL("U"."NAME",'SYS')='BAS01' OR NVL("U"."NAME",'SYS')='DATASYNC_1' OR
- NVL("U"."NAME",'SYS')='DATASYNC_2' OR NVL("U"."NAME",'SYS')='OSS_CMS')
- 31 - access("S"."USER#"="U"."USER#"(+))
- 33 - filter("UN"."STATUS{1}quot;<>1)
- 34 - filter("S"."TYPE#"=1 OR "S"."TYPE#"=10)
- 35 - access("S"."TS#"="UN"."TS#" AND "S"."FILE#"="UN"."FILE#" AND "S"."BLOCK#"="UN"."BLOCK#")
- 38 - access("S"."TS#"="TS"."TS#")
- 39 - access("UN"."TS#"="F"."TS#" AND "UN"."FILE#"="F"."RELFILE#")
- 40 - access("S"."TS#"="TS"."TS#")
- 42 - filter(NVL("U"."NAME",'SYS')='DATASYNC_PRC' OR NVL("U"."NAME",'SYS')='OSS03' OR
- NVL("U"."NAME",'SYS')='BAS01' OR NVL("U"."NAME",'SYS')='DATASYNC_1' OR
- NVL("U"."NAME",'SYS')='DATASYNC_2' OR NVL("U"."NAME",'SYS')='OSS_CMS')
- 43 - access("S"."USER#"="U"."USER#"(+))
- 47 - filter("S"."TYPE#"<>6 AND "S"."TYPE#"<>5 AND "S"."TYPE#"<>8 AND "S"."TYPE#"<>10 AND
- "S"."TYPE#"<>1)
- 48 - access("S"."TS#"="F"."TS#" AND "S"."FILE#"="F"."RELFILE#")
- 51 - filter("T"."ANALYZETIME" IS NULL OR CASE WHEN "T"."ANALYZETIME" IS NULL THEN NULL WHEN
- ("M"."INSERTS"+"M"."DELETES"+"M"."UPDATES">"T"."ROWCNT"*TO_NUMBER("DBMS_STATS"."GET_PREFS"('STALE_PERCEN
- T',"U"."NAME","O"."NAME"))/100 OR BITAND("M"."FLAGS",1)=1) THEN 'YES' ELSE 'NO' END ='YES')
- 58 - access("U"."NAME"='BAS01' OR "U"."NAME"='DATASYNC_1' OR "U"."NAME"='DATASYNC_2' OR
- "U"."NAME"='DATASYNC_PRC' OR "U"."NAME"='OSS03' OR "U"."NAME"='OSS_CMS')
- 59 - access("O"."OWNER#"="U"."USER#" AND "O"."NAME"=:B1 AND "O"."NAMESPACE"=1 AND "O"."REMOTEOWNER"
- IS NULL AND "O"."LINKNAME" IS NULL AND "O"."SUBNAME" IS NULL)
- filter("O"."SUBNAME" IS NULL AND "O"."REMOTEOWNER" IS NULL AND "O"."LINKNAME" IS NULL)
- 60 - access("O"."OBJ#"="TS"."OBJ#"(+))
- 61 - filter(BITAND("T"."PROPERTY",1)=0)
- 62 - access("O"."OBJ#"="T"."OBJ#")
- 64 - access("T"."OBJ#"="M"."OBJ#"(+))
- 66 - filter("TP"."ANALYZETIME" IS NULL OR CASE WHEN "TP"."ANALYZETIME" IS NULL THEN NULL WHEN
- ("M"."INSERTS"+"M"."DELETES"+"M"."UPDATES">"TP"."ROWCNT"*TO_NUMBER("DBMS_STATS"."GET_PREFS"('STALE_PERCE
- NT',"U"."NAME","O"."NAME"))/100 OR BITAND("M"."FLAGS",1)=1) THEN 'YES' ELSE 'NO' END ='YES')
- 68 - access("O"."OBJ#"="TP"."OBJ#")
- 73 - access("U"."NAME"='BAS01' OR "U"."NAME"='DATASYNC_1' OR "U"."NAME"='DATASYNC_2' OR
- "U"."NAME"='DATASYNC_PRC' OR "U"."NAME"='OSS03' OR "U"."NAME"='OSS_CMS')
- 74 - access("O"."OWNER#"="U"."USER#" AND "O"."NAME"=:B1 AND "O"."NAMESPACE"=1 AND "O"."REMOTEOWNER"
- IS NULL AND "O"."LINKNAME" IS NULL)
- filter("O"."REMOTEOWNER" IS NULL AND "O"."LINKNAME" IS NULL)
- 75 - access("O"."OBJ#"="TS"."OBJ#"(+))
- 77 - filter("FILE#">0 AND "BLOCK#">0)
- 79 - access("TP"."OBJ#"="M"."OBJ#"(+))
- 81 - access("TP"."BO#"="TAB"."OBJ#")
- 87 - filter("BLOCK#"=0 AND "FILE#"=0)
- 89 - access("TP"."OBJ#"="M"."OBJ#"(+))
- 90 - filter("O"."NAME"=:B1 AND "O"."NAMESPACE"=1 AND "O"."REMOTEOWNER" IS NULL AND "O"."LINKNAME" IS
- NULL)
- 91 - access("O"."OBJ#"="TP"."OBJ#")
- 92 - filter(("U"."NAME"='BAS01' OR "U"."NAME"='DATASYNC_1' OR "U"."NAME"='DATASYNC_2' OR
- "U"."NAME"='DATASYNC_PRC' OR "U"."NAME"='OSS03' OR "U"."NAME"='OSS_CMS') AND ("TP"."ANALYZETIME" IS
- NULL OR CASE WHEN "TP"."ANALYZETIME" IS NULL THEN NULL WHEN
- ("M"."INSERTS"+"M"."DELETES"+"M"."UPDATES">"TP"."ROWCNT"*TO_NUMBER("DBMS_STATS"."GET_PREFS"('STALE_PERCE
- NT',"U"."NAME","O"."NAME"))/100 OR BITAND("M"."FLAGS",1)=1) THEN 'YES' ELSE 'NO' END ='YES'))
- 93 - access("O"."OWNER#"="U"."USER#")
- 95 - access("TP"."BO#"="TAB"."OBJ#")
- 97 - filter("TCP"."ANALYZETIME" IS NULL OR CASE WHEN "TCP"."ANALYZETIME" IS NULL THEN NULL WHEN
- ("M"."INSERTS"+"M"."DELETES"+"M"."UPDATES">"TCP"."ROWCNT"*TO_NUMBER("DBMS_STATS"."GET_PREFS"('STALE_PERC
- ENT',"U"."NAME","O"."NAME"))/100 OR BITAND("M"."FLAGS",1)=1) THEN 'YES' ELSE 'NO' END ='YES')
- 99 - access("O"."OBJ#"="TCP"."OBJ#")
- 104 - access("U"."NAME"='BAS01' OR "U"."NAME"='DATASYNC_1' OR "U"."NAME"='DATASYNC_2' OR
- "U"."NAME"='DATASYNC_PRC' OR "U"."NAME"='OSS03' OR "U"."NAME"='OSS_CMS')
- 105 - access("O"."OWNER#"="U"."USER#" AND "O"."NAME"=:B1 AND "O"."NAMESPACE"=1 AND "O"."REMOTEOWNER"
- IS NULL AND "O"."LINKNAME" IS NULL)
- filter("O"."REMOTEOWNER" IS NULL AND "O"."LINKNAME" IS NULL)
- 106 - access("O"."OBJ#"="TS"."OBJ#"(+))
- 110 - access("TCP"."OBJ#"="M"."OBJ#"(+))
- 112 - access("TCP"."BO#"="TAB"."OBJ#")
- 116 - filter("TSP"."ANALYZETIME" IS NULL OR CASE WHEN "TSP"."ANALYZETIME" IS NULL THEN NULL WHEN
- ("M"."INSERTS"+"M"."DELETES"+"M"."UPDATES">"TSP"."ROWCNT"*TO_NUMBER("DBMS_STATS"."GET_PREFS"('STALE_PERC
- ENT',"U"."NAME","PO"."NAME"))/100 OR BITAND("M"."FLAGS",1)=1) THEN 'YES' ELSE 'NO' END ='YES')
- 118 - access("TCP"."OBJ#"="TSP"."POBJ#")
- 119 - access("PO"."OBJ#"="TCP"."OBJ#")
- 123 - access("U"."NAME"='BAS01' OR "U"."NAME"='DATASYNC_1' OR "U"."NAME"='DATASYNC_2' OR
- "U"."NAME"='DATASYNC_PRC' OR "U"."NAME"='OSS03' OR "U"."NAME"='OSS_CMS')
- 124 - access("U"."USER#"="PO"."OWNER#" AND "PO"."NAME"=:B1 AND "PO"."NAMESPACE"=1 AND
- "PO"."REMOTEOWNER" IS NULL AND "PO"."LINKNAME" IS NULL)
- filter("PO"."REMOTEOWNER" IS NULL AND "PO"."LINKNAME" IS NULL)
- 128 - filter("FILE#">0 AND "BLOCK#">0)
- 130 - access("TSP"."OBJ#"="M"."OBJ#"(+))
- 131 - access("SO"."OBJ#"="TSP"."OBJ#")
- 132 - access("SO"."OBJ#"="TS"."OBJ#"(+))
- 134 - access("TCP"."BO#"="TAB"."OBJ#")
- 135 - filter(NULL IS NOT NULL)
- 136 - filter(DECODE(NVL("FOBJ"."OBJ#",0),0,TO_DATE(NULL),INTERNAL_FUNCTION("ST"."ANALYZETIME")) IS
- NULL)
- 139 - filter("T"."KQFTANAM"=:B1)
- 140 - filter("T"."KQFTAVER"="FOBJ"."TIMESTAMP"(+)-TO_DATE(' 1991-01-01 00:00:00', 'syyyy-mm-dd
- hh24:mi:ss'))
- 141 - access("T"."KQFTAOBJ"="FOBJ"."OBJ#"(+))
- 143 - access("T"."KQFTAOBJ"="ST"."OBJ#"(+))
- 已选择303行。
当时是下午,脑的晕晕的 没有怎么关注这个事情,晚上10点过睡觉起来,那位哥们又QQ找我了 呵呵,由于睡了一觉,加上自己一看到大SQL就像打了鸡血一样,所以再次请求那位哥们把SQL发给我,经过半分钟的分析,加了个HINT
- SELECT OWNER,
- SEGMENT_NAME,
- CASE
- WHEN SIZE_GB < 0.5 THEN
- 30
- WHEN SIZE_GB >= 0.5 AND SIZE_GB < 1 THEN
- 20
- WHEN SIZE_GB >= 1 AND SIZE_GB < 5 THEN
- 10
- WHEN SIZE_GB >= 5 AND SIZE_GB < 10 THEN
- 5
- WHEN SIZE_GB >= 10 THEN
- 1
- END AS PERCENT,
- 2 AS DEGREE
- FROM (SELECT OWNER,
- SEGMENT_NAME,
- SUM(BYTES / 1024 / 1024 / 1024) SIZE_GB
- FROM DBA_SEGMENTS A
- WHERE OWNER IN ('DATASYNC_PRC','OSS03','BAS01','DATASYNC_1','DATASYNC_2','OSS_CMS')
- AND SEGMENT_NAME IN
- (SELECT /*+ UNNEST */ DISTINCT TABLE_NAME
- FROM DBA_TAB_STATISTICS B
- WHERE (LAST_ANALYZED IS NULL OR STALE_STATS = 'YES')
- AND OWNER IN('DATASYNC_PRC','OSS03','BAS01','DATASYNC_1','DATASYNC_2','OSS_CMS'))
- GROUP BY OWNER, SEGMENT_NAME);
执行计划如下:
这次SQL能在1秒钟左右出结果,逻辑读由7千多W降低到8W多,我为什么加这个HINT就不说了,经常看我博客的人肯定懂的
有时候单独去访问数据字典很快,但是如果关联了太多数据字典性能就急剧下降,这个时候你不要怕,把它当成我们普通人写的SQL那样对待
很多人说遇到数据字典 加个 /*+ rule */ ,对于这个我是非常不赞同的
另外就是关于这个脚本 DBA任务---确保统计信息准确性
会收集所有分区的统计信息,而不是只收集某个分区(如果表的数据只有一个分区发生了变化那么重复收集分区统计信息就做无用功了)
所以如果哥们要借鉴我的这个SQL,请自己改写
评论暂时关闭