日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【性能优化】 之 10053 事件

發(fā)布時(shí)間:2024/4/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【性能优化】 之 10053 事件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.驗(yàn)證全表掃描的成本計(jì)算公式,貼出執(zhí)行計(jì)劃和計(jì)算公式。<br>
2.給出B-tree索引 Unique scan的成本計(jì)算公式,貼出執(zhí)行計(jì)劃和計(jì)算公式。<br>
3.通過10053事件分析一個(gè)SQL執(zhí)行計(jì)劃的產(chǎn)生過程,需要貼出trace中的相關(guān)信息和必要的文字說明。<br>
4.當(dāng)統(tǒng)計(jì)信息不準(zhǔn)確時(shí),CBO可能產(chǎn)生錯(cuò)誤的執(zhí)行計(jì)劃,請給出這樣的一個(gè)例子,在10053 trace中找到CBO出錯(cuò)的位置,并給出必要的文字說明。<br>

========================================================================================================
1.驗(yàn)證全表掃描的成本計(jì)算公式,貼出執(zhí)行計(jì)劃和計(jì)算公式。<br>

答:


C:\Users\Administrator>sqlplus tang/sa@orcl

SQL*Plus: Release 11.2.0.1.0 Production on Thu Dec 19 15:35:55 2013

Copyright (c) 1982, 2010, Oracle.? All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table t12 as select * from dba_objects;

Table created.

SQL>
--對表t12進(jìn)行統(tǒng)計(jì)分析,不做直方圖
SQL> begin
? 2? dbms_stats.gather_table_stats(user,'T12',CASCADE=>TRUE,ESTIMATE_PERCENT=> NULL,
? 3? METHOD_OPT=>'for all columns size 1');
? 4? end;
? 5? /

PL/SQL procedure successfully completed.

SQL>

SQL> set linesize 800;
SQL> set pagesize 400;

--數(shù)據(jù)庫塊大小8K
SQL>show parameter db_block_size
?
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
db_block_size??????????????????????? integer???? 8192

--查看一次IO讀多少個(gè)塊
SQL> show parameter db_file;

NAME?? ??? ??? ??? ??? ??? ??? ??? ?TYPE?? ??? ??? ??? ??? ??? ??? ??? ?VALUE
-------?? ??? ??? ??? ??? ??? ??? ??? ?-------------?? ??? ??? ??? ??? ??? ?----------------------

db_file_multiblock_read_count??????? integer?????????????????????????????? 128
db_file_name_convert???????????????? string
db_files???????????????????????????? integer?????????????????????????????? 200
SQL>

--查看t表所用塊數(shù)
SQL> select blocks from user_tables where table_name='T12';

??? BLOCKS
----------
????? 1115

SQL>


SQL>select * from sys.aux_stats$

? ??? ?SNAME?? ??? ??? ?PNAME?? ??? ?PVAL1?? ??? ??? ?PVAL2
?? ?-----------------------------------------------------
1?? ?SYSSTATS_INFO?? ?STATUS?? ??? ??? ??? ??? ??? ?COMPLETED
2?? ?SYSSTATS_INFO?? ?DSTART?? ??? ??? ??? ??? ??? ?11-03-2011 06:38
3?? ?SYSSTATS_INFO?? ?DSTOP?? ??? ??? ??? ??? ??? ?11-03-2011 06:38
4?? ?SYSSTATS_INFO?? ?FLAGS?? ??? ?1?? ?
5?? ?SYSSTATS_MAIN?? ?CPUSPEEDNW?? ?1720.20725388601?? ?
6?? ?SYSSTATS_MAIN?? ?IOSEEKTIM?? ?10?? ?
7?? ?SYSSTATS_MAIN?? ?IOTFRSPEED?? ?4096?? ?
8?? ?SYSSTATS_MAIN?? ?SREADTIM?? ??? ?
9?? ?SYSSTATS_MAIN?? ?MREADTIM?? ??? ?
10?? ?SYSSTATS_MAIN?? ?CPUSPEED?? ??? ?
11?? ?SYSSTATS_MAIN?? ?MBRC?? ??? ?
12?? ?SYSSTATS_MAIN?? ?MAXTHR?? ??? ?
13?? ?SYSSTATS_MAIN?? ?SLAVETHR?? ??? ?



SQL> set autot trace exp;
SQL> select * from t12;

Execution Plan
----------------------------------------------------------
Plan hash value: 2727786061

--------------------------------------------------------------------------
| Id? | Operation???????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |
--------------------------------------------------------------------------
|?? 0 | SELECT STATEMENT? |????? | 76437 |? 7315K|?? 306?? (1)| 00:00:04 |
|?? 1 |? TABLE ACCESS FULL| T12? | 76437 |? 7315K|?? 306?? (1)| 00:00:04 |
--------------------------------------------------------------------------

SQL>

成本計(jì)算公式:
?Cost = (
???????? #SRds +
???????? #MRds * mreadtim/sreadtim +
???????? CPUCycles / (cpuspeed*sreadtim)
???????? )
?--注釋:
?#SRDs - number of single block reads?? ?單塊讀 的塊數(shù)
?#MRDs - number of multi block reads?? ?多塊多 的塊數(shù)
?#CPUCycles - number of CPU Cycles?? ??? ?CPU頻率
?sreadtim? - single block read time?? ??? ?單塊讀的時(shí)間
?mreadtim - multi block read time?? ??? ?多塊讀的時(shí)間
?cpuspeed? -? CPU cycles per second?? ??? ?CPU當(dāng)前速度


1.#SRds=0 因?yàn)槭侨頀呙?#xff1b;
2.#MRds=塊數(shù)/多塊讀參數(shù)值=1115/128 =8.7109375 ?


SELECT TABLE_NAME,T.BLOCKS
FROM DBA_TABLES T WHERE T.TABLE_NAME='T12'
? ??? ?TABLE_NAME?? ?BLOCKS
?? ?-----------------------
1?? ?T12?? ?1115



3.#mreadtim

mreadtim =ioseektim+db_file_multiblock_count*db_block_size/iotftspeed=10+128*8192/4096=266



?? ?相關(guān)參數(shù)查詢:
?? ?SQL> select pval1 from sys.aux_stats$ where pname = 'IOSEEKTIM';

?? ??? ? PVAL1
?? ?----------
?? ??? ??? ?10

?? ?SQL> select value from v$parameter? where name='db_file_multiblock_read_count';
?? ??? ?VALUE
?? ??? ?---------------------------------------------------------------------------------------
?? ??? ?128

?? ?SQL> select value from v$parameter where name='db_block_size';

?? ?VALUE
?? ?--------------------------------------------------------------------------------
?? ?8192



?? ?SQL>? select pval1 from SYS.aux_stats$ where pname='IOTFRSPEED';

?? ??? ? PVAL1
?? ?----------
?? ??? ?? 4096





sreadtim =ioseektim+db_block_size/iotfrspeed=10+8192/4096=12

?相關(guān)參數(shù)數(shù)值:
??? SQL> select pval1 from sys.aux_stats$ where pname = 'IOSEEKTIM';
????? PVAL1
?----------
???????? 10
???? SQL> select value from v$parameter where name='db_block_size';
???? VALUE
???? --------------------------------------------------------------------------------------
???? 8192
???? SQL> select pval1 from sys.aux_stats$ where pname = 'IOTFRSPEED';
????? PVAL1
??? ----------
?????? 4096
?


CPUCycles? = 40808.316
CPUCycles等于 PLAN_TABLE里面的CPU_COST數(shù)值。

?? ?SQL> explain plan for select * from t12;
?? ?Explained.
?? ?
?? ?SQL> select cpu_cost from plan_table;
?? ? CPU_COST
?? ? --------------
?? ?40808316

?? ??? ?所以CPUCycles數(shù)值為40808316 ms,換算成s為 40808.316。
?? ?
6、cpuspeed
?? ??? ? cpuspeed 等于 CPUSPEEDNW的數(shù)值。
?? ??? ? SQL> select pval1 from sys.aux_stats$ where pname='CPUSPEEDNW';
?? ??? ?? PVAL1
?? ? ----------
?? ? 1720.20725

cpuspeed =? 1720.20725
?



Cost =#SRds+#MRds* mreadtim/sreadtim+#CPUCycles/(cpuspeed*sreadtim)

=0+(1115/128) * 266 / 12+? 40808.316/(1720.20725* 12)

?SQL> select ceil(0+1115/128 * 266 / 12+? 40808.316/(1720.20725* 12)) from dual;
?=196
?
196 與執(zhí)行計(jì)劃的306 差異為? 113,差異很大。還得再找原因。

經(jīng)測試,如果把參數(shù)db_file_multiblock_read_count修改成 16以后,

上面的公式計(jì)算出的成本 為:

mreadtim =ioseektim+db_file_multiblock_count*db_block_size/iotftspeed=10+16*8192/4096=42



Cost = ceil(0+(1115/16) * 42 / 12+? 40808.316/(1720.20725* 12)) =246

倒是很執(zhí)行計(jì)劃的計(jì)算沒有多少差別了。

SQL> alter session set db_file_multiblock_read_count=16;

Session altered.

SQL> show parameter db_file_multi;

NAME?? ??? ??? ??? ??? ??? ??? ??? ?TYPE?? ????? VALUE
------ ------------------------------------------------------
db_file_multiblock_read_count??????? integer????? 16
SQL> set autot trace exp;
SQL> select * from t12;

Execution Plan
----------------------------------------------------------
Plan hash value: 2727786061

--------------------------------------------------------------------------
| Id? | Operation???????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |
--------------------------------------------------------------------------
|?? 0 | SELECT STATEMENT? |????? | 76437 |? 7315K|?? 248?? (1)| 00:00:03 |
|?? 1 |? TABLE ACCESS FULL| T12? | 76437 |? 7315K|?? 248?? (1)| 00:00:03 |
--------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------
2.給出B-tree索引 Unique scan的成本計(jì)算公式,貼出執(zhí)行計(jì)劃和計(jì)算公式。<br>

?? ?SQL>
?? ?SQL> set autot trace exp;
?? ?SQL> select * from t12;

?? ?Execution Plan
?? ?----------------------------------------------------------
?? ?Plan hash value: 2727786061

?? ?--------------------------------------------------------------------------
?? ?| Id? | Operation???????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |
?? ?--------------------------------------------------------------------------
?? ?|?? 0 | SELECT STATEMENT? |????? | 76437 |? 7315K|?? 306?? (1)| 00:00:04 |
?? ?|?? 1 |? TABLE ACCESS FULL| T12? | 76437 |? 7315K|?? 306?? (1)| 00:00:04 |
?? ?--------------------------------------------------------------------------

?? ?SQL> show parameter version;
?? ?SQL>
?? ?SQL>
?? ?SQL> create unique index pk_t12_id on t12(object_id);

?? ?Index created.

?? ?SQL> set linesize 200;
?? ?SQL> set pagesize 500;
?? ?SQL> set autot trace exp
?? ?SQL> ;
?? ?? 1* create unique index pk_t12_id on t12(object_id)
?? ?SQL> select * from t12 where object_id=1000;

?? ?Execution Plan
?? ?----------------------------------------------------------
?? ?Plan hash value: 1871783013

?? ?-----------------------------------------------------------------------------------------
?? ?| Id? | Operation?????????????????? | Name????? | Rows? | Bytes | Cost (%CPU)| Time???? |
?? ?-----------------------------------------------------------------------------------------
?? ?|?? 0 | SELECT STATEMENT??????????? |?????????? |???? 1 |??? 98 |???? 2?? (0)| 00:00:01 |
?? ?|?? 1 |? TABLE ACCESS BY INDEX ROWID| T12?????? |???? 1 |??? 98 |???? 2?? (0)| 00:00:01 |
?? ?|*? 2 |?? INDEX UNIQUE SCAN???????? | PK_T12_ID |???? 1 |?????? |???? 1?? (0)| 00:00:01 |
?? ?-----------------------------------------------------------------------------------------

?? ?Predicate Information (identified by operation id):
?? ?---------------------------------------------------

?? ??? 2 - access("OBJECT_ID"=1000)

?? ?SQL> set autot off;
?? ?SQL> select index_name,blevel,leaf_blocks,clustering_factor,num_rows from user_indexes where index_name='PK_T12_ID';

?? ?INDEX_NAME????????? BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR?? NUM_ROWS
?? ?------------------ ---------- ----------- ----------------- ----------
?? ?PK_T12_ID????????? 1???????? 159????????????? 1299????? 76430

?? ?SQL>

?? ?--計(jì)算Unique scan成本
?? ? Unique scan的成本計(jì)算公式=blevel+1=1+1=2
?? ? --小結(jié):
?? ? 手工計(jì)算的Unique scan的成本為1與執(zhí)行計(jì)劃的Cost相同





--------------------------------------------------------------------------------------------------
3.通過10053事件分析一個(gè)SQL執(zhí)行計(jì)劃的產(chǎn)生過程,需要貼出trace中的相關(guān)信息和必要的文字說明。<br>


3.1為了查看有索引時(shí)的執(zhí)行計(jì)劃,先建立一個(gè)索引
SQL> create index idx_t12_owner on t12(owner);

Index created.

SQL>


SQL> execute dbms_stats.gather_table_stats(user,'T12',cascade=>true,estimate_percent=>null,method_opt=>'for all columns size 1');
PL/SQL procedure successfully completed


SQL>
SQL> create table t12_owner as select * from (select distinct owner from t12 ) where rownum<=10;

Table created.


SQL> execute dbms_stats.gather_table_stats(user,'T12_OWNER',cascade=>true,estimate_percent=>null,method_opt=>'for all columns size 1');
PL/SQL procedure successfully completed


SQL> alter system flush shared_pool;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> set linesize 400;
SQL> set pagesize 400;
SQL> select count(*) from t12_owner o,t12? t where o.owner=t.owner;

Execution Plan
----------------------------------------------------------
Plan hash value: 1246238126

-------------------------------------------------------------------------------------
| Id? | Operation?????????? | Name????????? | Rows? | Bytes | Cost (%CPU)| Time???? |
-------------------------------------------------------------------------------------
|?? 0 | SELECT STATEMENT??? |?????????????? |???? 1 |??? 15 |??? 53?? (0)| 00:00:01 |
|?? 1 |? SORT AGGREGATE???? |?????????????? |???? 1 |??? 15 |??????????? |????????? |
|?? 2 |?? NESTED LOOPS????? |?????????????? | 24657 |?? 361K|??? 53?? (0)| 00:00:01 |
|?? 3 |??? TABLE ACCESS FULL| T12_OWNER???? |??? 10 |??? 90 |???? 3?? (0)| 00:00:01 |
|*? 4 |??? INDEX RANGE SCAN | IDX_T12_OWNER |? 2466 | 14796 |???? 5?? (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

?? 4 - access("O"."OWNER"="T"."OWNER")

SQL>

SQL> set autot off;
SQL> alter system flush shared_pool;

System altered.

SQL> alter system flush shared_pool;

System altered.

SQL> alter system flush shared_pool;

System altered.

SQL> alter session set events '10053 trace name context forever, level 2';

Session altered.

SQL> select count(*) from t12_owner o,t12? t where o.owner=t.owner;

? COUNT(*)
----------
????? 6162

SQL> alter session set events '10053 trace name context off';

Session altered.

SQL>EXIT





trace file contect:
-------------------------------------------------------------------------------------------------
跟蹤文件內(nèi)容解讀


? ***************************************
? PARAMETERS IN OPT_PARAM HINT
? ****************************
***************************************
Column Usage Monitoring is ON: tracking level = 1
***************************************

Considering Query Transformations on query block SEL$1 (#0)
**************************
Query transformations (QT)
**************************
JF: Checking validity of join factorization for query block SEL$1 (#0)
JF: Bypassed: not a UNION or UNION-ALL query block.
ST: not valid since star transformation parameter is FALSE
TE: Checking validity of table expansion for query block SEL$1 (#0)
TE: Bypassed: No partitioned table in query block.
CBQT bypassed for query block SEL$1 (#0): no complex view, sub-queries or UNION (ALL) queries.
CBQT: Validity checks failed for 530jrynjh1h0c.
CSE: Considering common sub-expression elimination in query block SEL$1 (#0)
*************************
Common Subexpression elimination (CSE)
*************************
CSE:???? CSE not performed on query block SEL$1 (#0).
OBYE:?? Considering Order-by Elimination from view SEL$1 (#0)
***************************
Order-by elimination (OBYE)
***************************
OBYE:???? OBYE bypassed: no order by to eliminate.
JE:?? Considering Join Elimination on query block SEL$1 (#0)
*************************
Join Elimination (JE)?? ?
*************************
SQL:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "COUNT(*)" FROM "TANG"."T12_OWNER" "O","TANG"."T12" "T" WHERE "O"."OWNER"="T"."OWNER"
JE:?? cfro: T12_OWNER objn:98415 col#:1 dfro:T12 dcol#:1
JE:?? cfro: T12 objn:98532 col#:1 dfro:T12_OWNER dcol#:1
SQL:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "COUNT(*)" FROM "TANG"."T12_OWNER" "O","TANG"."T12" "T" WHERE "O"."OWNER"="T"."OWNER"
Query block SEL$1 (#0) unchanged
CVM: Considering view merge in query block SEL$1 (#0)
OJE: Begin: find best directive for query block SEL$1 (#0)
OJE: End: finding best directive for query block SEL$1 (#0)
CNT:?? Considering count(col) to count(*) on query block SEL$1 (#0)
*************************
Count(col) to Count(*) (CNT)
*************************
CNT:???? COUNT() to COUNT(*) not done.
JE:?? Considering Join Elimination on query block SEL$1 (#0)
*************************
Join Elimination (JE)?? ?
*************************
SQL:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "COUNT(*)" FROM "TANG"."T12_OWNER" "O","TANG"."T12" "T" WHERE "O"."OWNER"="T"."OWNER"
JE:?? cfro: T12_OWNER objn:98415 col#:1 dfro:T12 dcol#:1
JE:?? cfro: T12 objn:98532 col#:1 dfro:T12_OWNER dcol#:1
SQL:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "COUNT(*)" FROM "TANG"."T12_OWNER" "O","TANG"."T12" "T" WHERE "O"."OWNER"="T"."OWNER"
Query block SEL$1 (#0) unchanged
query block SEL$1 (#0) unchanged
Considering Query Transformations on query block SEL$1 (#0)
**************************
Query transformations (QT)
**************************
JF: Checking validity of join factorization for query block SEL$1 (#0)
JF: Bypassed: not a UNION or UNION-ALL query block.
ST: not valid since star transformation parameter is FALSE
TE: Checking validity of table expansion for query block SEL$1 (#0)
TE: Bypassed: No partitioned table in query block.
CBQT bypassed for query block SEL$1 (#0): no complex view, sub-queries or UNION (ALL) queries.
CBQT: Validity checks failed for 530jrynjh1h0c.
CSE: Considering common sub-expression elimination in query block SEL$1 (#0)
*************************
Common Subexpression elimination (CSE)
*************************
CSE:???? CSE not performed on query block SEL$1 (#0).
SU: Considering subquery unnesting in query block SEL$1 (#0)
********************
Subquery Unnest (SU)
********************
SJC: Considering set-join conversion in query block SEL$1 (#0)
*************************
Set-Join Conversion (SJC)
*************************
SJC: not performed
JE:?? Considering Join Elimination on query block SEL$1 (#0)
*************************
Join Elimination (JE)?? ?
*************************
SQL:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "COUNT(*)" FROM "TANG"."T12_OWNER" "O","TANG"."T12" "T" WHERE "O"."OWNER"="T"."OWNER"
JE:?? cfro: T12_OWNER objn:98415 col#:1 dfro:T12 dcol#:1
JE:?? cfro: T12 objn:98532 col#:1 dfro:T12_OWNER dcol#:1
SQL:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "COUNT(*)" FROM "TANG"."T12_OWNER" "O","TANG"."T12" "T" WHERE "O"."OWNER"="T"."OWNER"
Query block SEL$1 (#0) unchanged
PM: Considering predicate move-around in query block SEL$1 (#0)
**************************
Predicate Move-Around (PM)
**************************
PM:???? PM bypassed: Outer query contains no views.
PM:???? PM bypassed: Outer query contains no views.
query block SEL$1 (#0) unchanged
FPD: Considering simple filter push in query block SEL$1 (#0)
"O"."OWNER"="T"."OWNER"
try to generate transitive predicate from check constraints for query block SEL$1 (#0)
finally: "O"."OWNER"="T"."OWNER"

apadrv-start sqlid=5873318390038315020
? :
??? call(in-use=2056, alloc=16344), compile(in-use=58144, alloc=62216), execution(in-use=3352, alloc=4032)

*******************************************
Peeked values of the binds in SQL statement
*******************************************

Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "COUNT(*)" FROM "TANG"."T12_OWNER" "O","TANG"."T12" "T" WHERE "O"."OWNER"="T"."OWNER"
kkoqbc: optimizing query block SEL$1 (#0)
?????? ?
??????? :
??? call(in-use=2112, alloc=16344), compile(in-use=59408, alloc=62216), execution(in-use=3352, alloc=4032)

kkoqbc-subheap (create addr=0x000000001F2CFAA0)
****************
QUERY BLOCK TEXT
****************
select count(*) from t12_owner o,t12? t where o.owner=t.owner
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (optimizer): qb_name=SEL$1 nbfros=2 flg=0
? fro(0): flg=0 objn=98532 hint_alias="O"@"SEL$1"
? fro(1): flg=0 objn=98415 hint_alias="T"@"SEL$1"

-----------------------------
SYSTEM STATISTICS INFORMATION
-----------------------------
? Using NOWORKLOAD Stats
? CPUSPEEDNW: 1720 millions instructions/sec (default is 100)
? IOTFRSPEED: 4096 bytes per millisecond (default is 4096)
? IOSEEKTIM:? 10 milliseconds (default is 10)
? MBRC:?????? NO VALUE blocks (default is 8)

***************************************
BASE STATISTICAL INFORMATION

基礎(chǔ)統(tǒng)計(jì)信息
***********************
Table Stats::
? Table: T12? Alias:? T
#? 表:T12 統(tǒng)計(jì)信息中的: 行數(shù):76437,數(shù)據(jù)塊:1115;平均行長度

#Column? 字段OWNER 的統(tǒng)計(jì)信息(直方圖中的字段統(tǒng)計(jì)信息)
#AvgLen:6? 平均長度
#NDV: 31 (NUM_DISTINCT 列的不重復(fù)值數(shù))
# Nulls: 0 (NUM_NULLS? 列的空行數(shù))
# Density: 0.032258 (DENSITY 列密度,沒有直方圖的情況下= 1/NDV)


??? #Rows: 76437? #Blks:? 1115? AvgRowLen:? 98.00? ChainCnt:? 0.00


? Column (#1): OWNER(
??? AvgLen: 6 NDV: 31 Nulls: 0 Density: 0.032258

索引的統(tǒng)計(jì)信息
#LVLS: 1? (BLEVEL BTREE索引高度)
#LB: 180 (LEAF_BLOCKS 索引葉塊數(shù))
#DK: 31 (DISTINCT_KEYS 不重復(fù)索引關(guān)鍵字)
#LB/K: 5.00 (AVG_LEAF_BLOCKS_PER_KEY 葉塊/關(guān)鍵字)
#DB/K: 65.00 (AVG_DATA_BLOCKS_PER_KEY 數(shù)據(jù)塊/關(guān)鍵字)
#CLUF: 2031.00 (CLUSTERING_FACTOR 索引聚合因子)
#主要內(nèi)容:索引幾層;葉子塊數(shù);多少個(gè)唯一鍵值; 每個(gè)鍵值有多少個(gè)葉塊;每個(gè)鍵值有多少個(gè)數(shù)據(jù)塊聚簇因子

Index Stats::
? Index: IDX_T12_OWNER? Col#: 1
??? LVLS: 1? #LB: 180? #DK: 31? LB/K: 5.00? DB/K: 65.00? CLUF: 2031.00
? Index: PK_T12_ID? Col#: 4
??? LVLS: 1? #LB: 159? #DK: 76430? LB/K: 1.00? DB/K: 1.00? CLUF: 1299.00
***********************
表T12_OWNER 的統(tǒng)計(jì)信息
Table Stats::
? Table: T12_OWNER? Alias:? O
??? #Rows: 10? #Blks:? 4? AvgRowLen:? 9.00? ChainCnt:? 0.00
關(guān)聯(lián)字段OWNER 的統(tǒng)計(jì)信息(直方圖中的字段統(tǒng)計(jì)信息)
? Column (#1): OWNER(
??? AvgLen: 9 NDV: 10 Nulls: 0 Density: 0.100000
Access path analysis for T12_OWNER
***************************************
#分析單表的訪問路徑,有些信息來自于dba_tables
#原始行數(shù) 近似值 精確值 非修正值
SINGLE TABLE ACCESS PATH
? Single Table Cardinality Estimation for T12_OWNER[O]
? Table: T12_OWNER? Alias: O
? #(Computed=Card: Original *FF Filter Factor? FF在沒有直方圖的情況下=Density)


??? Card: Original: 10.000000? Rounded: 10? Computed: 10.00? Non Adjusted: 10.00
? Access Path: TableScan
??? Cost:? 3.00? Resp: 3.00? Degree: 0
????? Cost_io: 3.00? Cost_cpu: 29986
????? Resp_io: 3.00? Resp_cpu: 29986

#全表掃描成本
? Best:: AccessPath: TableScan ?
???????? Cost: 3.00? Degree: 1? Resp: 3.00? Card: 10.00? Bytes: 0

Access path analysis for T12
***************************************
SINGLE TABLE ACCESS PATH
? Single Table Cardinality Estimation for T12[T]#單表基數(shù)估計(jì)
? Table: T12? Alias: T
??? Card: Original: 76437.000000? Rounded: 76437? Computed: 76437.00? Non Adjusted: 76437.00
? Access Path: TableScan?? ??? ??? ??? ??? ??? ?#全表掃描代價(jià)
??? Cost:? 304.94? Resp: 304.94? Degree: 0
????? Cost_io: 304.00? Cost_cpu: 19405956
????? Resp_io: 304.00? Resp_cpu: 19405956
? Access Path: index (index (FFS))?? ??? ??? ??? ?#索引快速全掃描
??? Index: IDX_T12_OWNER
??? resc_io: 51.00? resc_cpu: 10454299?? ??? ??? ??? ?#串行訪問代價(jià)=51(因?yàn)樗饕谴写鎯?chǔ)的)
??? ix_sel: 0.000000? ix_sel_with_filters: 1.000000? #帶過濾條件索引選擇率
? Access Path: index (FFS)
??? Cost:? 51.51? Resp: 51.51? Degree: 1?? ??? ?#索引并行訪問代價(jià)=51.51>51(串行訪問代價(jià))
????? Cost_io: 51.00? Cost_cpu: 10454299
????? Resp_io: 51.00? Resp_cpu: 10454299
? Access Path: index (FullScan)?? ??? ??? ??? ??? ?#索引全掃描
??? Index: IDX_T12_OWNER
??? resc_io: 181.00? resc_cpu: 16576381
??? ix_sel: 1.000000? ix_sel_with_filters: 1.000000 #ix_sel索引選擇率 ix_sel_with_filters帶過濾條件索引選擇率
??? Cost: 181.80? Resp: 181.80? Degree: 1
******** Begin index join costing ********
? ****** trying bitmap/domain indexes ******?? ?#索引關(guān)聯(lián)掃描
? Access Path: index (FullScan)
??? Index: IDX_T12_OWNER
??? resc_io: 181.00? resc_cpu: 16576381
??? ix_sel: 1.000000? ix_sel_with_filters: 1.000000
??? Cost: 181.80? Resp: 181.80? Degree: 0
? Access Path: index (FullScan)?? ??? ??? ??? ??? ?#全索引掃描
??? Index: IDX_T12_OWNER
??? resc_io: 181.00? resc_cpu: 16576381
??? ix_sel: 1.000000? ix_sel_with_filters: 1.000000
??? Cost: 181.80? Resp: 181.80? Degree: 0
? Bitmap nodes:?? ??? ??? ??? ??? ??? ??? ??? ??? ?#BITMAP 掃描
??? Used IDX_T12_OWNER
????? Cost = 227.253778, sel = 1.000000
? ****** finished trying bitmap/domain indexes ******
******** End index join costing ********
? Best:: AccessPath: IndexFFS
? Index: IDX_T12_OWNER
???????? Cost: 51.51? Degree: 1? Resp: 51.51? Card: 76437.00? Bytes: 0

***************************************
#關(guān)聯(lián)查詢—驅(qū)動(dòng)表的選擇
#優(yōu)化器的統(tǒng)計(jì)和計(jì)算
#把各種情況羅列出來,選擇最優(yōu)的查詢路徑
#分別用兩個(gè)表做驅(qū)動(dòng)表,及各種關(guān)聯(lián)方式的成本 對比。

OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS?? ??? ?選擇執(zhí)行計(jì)劃
***************************************
Considering cardinality-based initial join order.
Permutations for Starting Table :0
Join order[1]:? T12_OWNER[O]#0? T12[T]#1 #關(guān)聯(lián)的表對象

***************
Now joining: T12[T]#1?? ??? ?#1 現(xiàn)在要用T12_OWNER小表關(guān)聯(lián)T12大表
***************
NL Join?? ??? ??? ??? ??? ??? ?#NL Join嵌套循環(huán)關(guān)聯(lián)? OUTER TABLE 驅(qū)動(dòng)表

#確定一個(gè)驅(qū)動(dòng)表(outer table),另一個(gè)表為inner table,驅(qū)動(dòng)表中的每一行與inner表中的相應(yīng)記錄JOIN


? Outer table: Card: 10.00? Cost: 3.00? Resp: 3.00? Degree: 1? Bytes: 9
Access path analysis for T12?? ??? ?
? Inner table: T12? Alias: T?? ??? ?#inner TABLE 內(nèi)表 T12
? Access Path: TableScan
??? NL Join:? Cost: 3034.40? Resp: 3034.40? Degree: 1?? ??? ?#全表掃描-嵌套循環(huán)關(guān)聯(lián)COST=3034.40
????? Cost_io: 3025.00? Cost_cpu: 194089542
????? Resp_io: 3025.00? Resp_cpu: 194089542
? Access Path: index (index (FFS))?? ??? ??? ??? ??? ??? ??? ?#快速索引掃描
??? Index: IDX_T12_OWNER
??? resc_io: 48.90? resc_cpu: 10454299?? ??? ??? ??? ??? ??? ?#串行訪問代價(jià)
??? ix_sel: 0.000000? ix_sel_with_filters: 1.000000
? Inner table: T12? Alias: T
? Access Path: index (FFS)?? ??? ??? ??? ??? ??? ??? ??? ??? ?#并行訪問代價(jià)
??? NL Join:? Cost: 497.07? Resp: 497.07? Degree: 1
????? Cost_io: 492.00? Cost_cpu: 104572978
????? Resp_io: 492.00? Resp_cpu: 104572978
? Access Path: index (AllEqJoinGuess)
??? Index: IDX_T12_OWNER
??? resc_io: 5.00? resc_cpu: 529657
??? ix_sel: 0.032258? ix_sel_with_filters: 0.032258
??? NL Join : Cost: 53.26? Resp: 53.26? Degree: 1
????? Cost_io: 53.00? Cost_cpu: 5326558
????? Resp_io: 53.00? Resp_cpu: 5326558

? Best NL cost: 53.26?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?#最優(yōu)NL JOIN? 嵌套循環(huán)關(guān)聯(lián) 成本 :53.26
????????? resc: 53.26? resc_io: 53.00? resc_cpu: 5326558?? ?#串行方式的代價(jià) IO代價(jià)+CPU代價(jià)?? ?
????????? resp: 53.26? resp_io: 53.00? resc_cpu: 5326558?? ?#并行方式的代價(jià)
Join Card:? 24657.096774 = outer (10.000000) * inner (76437.000000) * sel (0.032258)
Join Card - Rounded: 24657 Computed: 24657.10
? Outer table:? T12_OWNER? Alias: O
??? resc: 3.00? card 10.00? bytes: 9? deg: 1? resp: 3.00
? Inner table:? T12? Alias: T
??? resc: 51.51? card: 76437.00? bytes: 6? deg: 1? resp: 51.51
??? using dmeth: 2? #groups: 1
??? SORT ressource???????? Sort statistics
????? Sort width:???????? 980 Area size:???? 1048576 Max Area size:?? 171642880
????? Degree:?????????????? 1
????? Blocks to Sort: 1 Row size:???? 20 Total Rows:???????????? 10
????? Initial runs:?? 1 Merge passes:? 0 IO Cost / pass:????????? 0
????? Total IO sort cost: 0????? Total CPU sort cost: 20643984
????? Total Temp space used: 0
??? SORT ressource???????? Sort statistics
????? Sort width:???????? 980 Area size:???? 1048576 Max Area size:?? 171642880
????? Degree:?????????????? 1
????? Blocks to Sort: 160 Row size:???? 17 Total Rows:????????? 76437
????? Initial runs:?? 2 Merge passes:? 1 IO Cost / pass:???????? 88
????? Total IO sort cost: 248????? Total CPU sort cost: 80448497
????? Total Temp space used: 1860000
? SM join: Resc: 307.41? Resp: 307.41? [multiMatchCost=0.00]
SM Join?? ?#先排序后合并關(guān)聯(lián)
? SM cost: 307.41
???? resc: 307.41 resc_io: 302.00 resc_cpu: 111576765
???? resp: 307.41 resp_io: 302.00 resp_cpu: 111576765
? Outer table:? T12_OWNER? Alias: O
??? resc: 3.00? card 10.00? bytes: 9? deg: 1? resp: 3.00
? Inner table:? T12? Alias: T
??? resc: 51.51? card: 76437.00? bytes: 6? deg: 1? resp: 51.51
??? using dmeth: 2? #groups: 1
??? Cost per ptn: 0.87? #ptns: 1
??? hash_area: 256 (max=41905) buildfrag: 1? probefrag: 168? ppasses: 1
? Hash join: Resc: 55.38? Resp: 55.38? [multiMatchCost=0.00]
HA Join?? ?
? HA cost: 55.38 ?
???? resc: 55.38 resc_io: 54.00 resc_cpu: 28450728
???? resp: 55.38 resp_io: 54.00 resp_cpu: 28450728
Best:: JoinMethod: NestedLoop
?????? Cost: 53.26? Degree: 1? Resp: 53.26? Card: 24657.10 Bytes: 15
***********************
Best so far:? Table#: 0? cost: 3.0015? card: 10.0000? bytes: 90
????????????? Table#: 1? cost: 53.2580? card: 24657.0968? bytes: 369855
***********************
Join order[2]:? T12[T]#1? T12_OWNER[O]#0

***************
Now joining: T12_OWNER[O]#0
***************
NL Join?? ?#NL Join 嵌套循環(huán)關(guān)聯(lián)?? ?與T12為驅(qū)動(dòng)表
? Outer table: Card: 76437.00? Cost: 51.51? Resp: 51.51? Degree: 1? Bytes: 6
Access path analysis for T12_OWNER
? Inner table: T12_OWNER? Alias: O
? Access Path: TableScan
??? NL Join:? Cost: 82971.54? Resp: 82971.54? Degree: 1
????? Cost_io: 82860.00? Cost_cpu: 2302475836
????? Resp_io: 82860.00? Resp_cpu: 2302475836

? Best NL cost: 82971.54
????????? resc: 82971.54? resc_io: 82860.00? resc_cpu: 2302475836
????????? resp: 82971.54? resp_io: 82860.00? resc_cpu: 2302475836
Join Card:? 24657.096774 = outer (76437.000000) * inner (10.000000) * sel (0.032258)
Join Card - Rounded: 24657 Computed: 24657.10
? Outer table:? T12? Alias: T
??? resc: 51.51? card 76437.00? bytes: 6? deg: 1? resp: 51.51
? Inner table:? T12_OWNER? Alias: O
??? resc: 3.00? card: 10.00? bytes: 9? deg: 1? resp: 3.00
??? using dmeth: 2? #groups: 1
??? SORT ressource???????? Sort statistics
????? Sort width:???????? 980 Area size:???? 1048576 Max Area size:?? 171642880
????? Degree:?????????????? 1
????? Blocks to Sort: 160 Row size:???? 17 Total Rows:????????? 76437
????? Initial runs:?? 2 Merge passes:? 1 IO Cost / pass:???????? 88
????? Total IO sort cost: 248????? Total CPU sort cost: 80448497
????? Total Temp space used: 1860000
??? SORT ressource???????? Sort statistics
????? Sort width:???????? 980 Area size:???? 1048576 Max Area size:?? 171642880
????? Degree:?????????????? 1
????? Blocks to Sort: 1 Row size:???? 20 Total Rows:???????????? 10
????? Initial runs:?? 1 Merge passes:? 0 IO Cost / pass:????????? 0
????? Total IO sort cost: 0????? Total CPU sort cost: 20643984
????? Total Temp space used: 0
? SM join: Resc: 307.41? Resp: 307.41? [multiMatchCost=0.00]
SM Join
? SM cost: 307.41
???? resc: 307.41 resc_io: 302.00 resc_cpu: 111576765
???? resp: 307.41 resp_io: 302.00 resp_cpu: 111576765
SM Join (with index on outer)
? Access Path: index (FullScan)
??? Index: IDX_T12_OWNER
??? resc_io: 181.00? resc_cpu: 16576381
??? ix_sel: 1.000000? ix_sel_with_filters: 1.000000
??? Cost: 181.80? Resp: 181.80? Degree: 1
? Outer table:? T12? Alias: T
??? resc: 181.80? card 76437.00? bytes: 6? deg: 1? resp: 181.80
? Inner table:? T12_OWNER? Alias: O
??? resc: 3.00? card: 10.00? bytes: 9? deg: 1? resp: 3.00
??? using dmeth: 2? #groups: 1
??? SORT ressource???????? Sort statistics
????? Sort width:???????? 980 Area size:???? 1048576 Max Area size:?? 171642880
????? Degree:?????????????? 1
????? Blocks to Sort: 1 Row size:???? 20 Total Rows:???????????? 10
????? Initial runs:?? 1 Merge passes:? 0 IO Cost / pass:????????? 0
????? Total IO sort cost: 0????? Total CPU sort cost: 20643984
????? Total Temp space used: 0
? SM join: Resc: 185.80? Resp: 185.80? [multiMatchCost=0.00]
? Outer table:? T12? Alias: T
??? resc: 51.51? card 76437.00? bytes: 6? deg: 1? resp: 51.51
? Inner table:? T12_OWNER? Alias: O
??? resc: 3.00? card: 10.00? bytes: 9? deg: 1? resp: 3.00
??? using dmeth: 2? #groups: 1
??? Cost per ptn: 1.06? #ptns: 1
??? hash_area: 256 (max=41905) buildfrag: 168? probefrag: 1? ppasses: 1
? Hash join: Resc: 55.68? Resp: 55.68? [multiMatchCost=0.12]
? Outer table:? T12_OWNER? Alias: O
??? resc: 3.00? card 10.00? bytes: 9? deg: 1? resp: 3.00
? Inner table:? T12? Alias: T
??? resc: 51.51? card: 76437.00? bytes: 6? deg: 1? resp: 51.51
??? using dmeth: 2? #groups: 1
??? Cost per ptn: 0.87? #ptns: 1
??? hash_area: 256 (max=41905) buildfrag: 1? probefrag: 168? ppasses: 1
? Hash join: Resc: 55.38? Resp: 55.38? [multiMatchCost=0.00]
HA Join?? ?哈希關(guān)聯(lián)
? HA cost: 55.38 swapped?? ?
???? resc: 55.38 resc_io: 54.00 resc_cpu: 28450728
???? resp: 55.38 resp_io: 54.00 resp_cpu: 28450728
Join order aborted: cost > best plan cost
***********************
(newjo-stop-1) k:0, spcnt:0, perm:2, maxperm:2000

*********************************
Number of join permutations tried: 2
*********************************
Consider using bloom filter between O[T12_OWNER] and T[T12] with ??
kkoBloomFilter: join ndv:0 reduction:1.000000 (limit:0.500000)? rejected because not a hash join
Enumerating distribution method (advanced)
--- Distribution method for
join between O[T12_OWNER](serial) and T[T12](serial); jm = 12; right side access path = IndexRange
---- NLJ default -> BROADCAST-LEFT

(newjo-save)??? [1 0 ]
Trying or-Expansion on query block SEL$1 (#0)
Transfer Optimizer annotations for query block SEL$1 (#0)
id=0 frofkks[i] (index start key) predicate="O"."OWNER"="T"."OWNER"
id=0 frofkke[i] (index stop key) predicate="O"."OWNER"="T"."OWNER"
Final cost for query block SEL$1 (#0) - All Rows Plan:?? ??? ??? ??? ??? ?#最后得出最佳成本 執(zhí)行計(jì)劃
? Best join order: 1
? Cost: 53.2580? Degree: 1? Card: 24657.0000? Bytes: 369855
? Resc: 53.2580? Resc_io: 53.0000? Resc_cpu: 5326558
? Resp: 53.2580? Resp_io: 53.0000? Resc_cpu: 5326558
kkoqbc-subheap (delete addr=0x000000001F2CFAA0, in-use=27840, alloc=32840)
kkoqbc-end:
??????? :
??? call(in-use=14400, alloc=65656), compile(in-use=60960, alloc=62216), execution(in-use=3352, alloc=4032)

kkoqbc: finish optimizing query block SEL$1 (#0)
apadrv-end
????????? :
??? call(in-use=14400, alloc=65656), compile(in-use=61944, alloc=62216), execution(in-use=3352, alloc=4032)


Starting SQL statement dump

user_id=84 user_name=TANG module=SQL*Plus action=
sql_id=530jrynjh1h0c plan_hash_value=1246238126 problem_type=3
----- Current SQL Statement for this session (sql_id=530jrynjh1h0c) -----
select count(*) from t12_owner o,t12? t where o.owner=t.owner
sql_text_length=62
sql=select count(*) from t12_owner o,t12? t where o.owner=t.owner
----- Explain Plan Dump -----
----- Plan Table -----
?
============
Plan Table
============
--------------------------------------------+-----------------------------------+
| Id? | Operation??????????? | Name???????? | Rows? | Bytes | Cost? | Time????? |
--------------------------------------------+-----------------------------------+
| 0?? | SELECT STATEMENT???? |????????????? |?????? |?????? |??? 53 |?????????? |
| 1?? |? SORT AGGREGATE????? |????????????? |???? 1 |??? 15 |?????? |?????????? |
| 2?? |?? NESTED LOOPS?????? |????????????? |?? 24K |? 361K |??? 53 |? 00:00:01 |
| 3?? |??? TABLE ACCESS FULL | T12_OWNER??? |??? 10 |??? 90 |???? 3 |? 00:00:01 |
| 4?? |??? INDEX RANGE SCAN? | IDX_T12_OWNER|? 2466 |?? 14K |???? 5 |? 00:00:01 |
--------------------------------------------+-----------------------------------+
Predicate Information:
----------------------
4 - access("O"."OWNER"="T"."OWNER")
?
Content of other_xml column
===========================
? db_version???? : 11.2.0.3
? parse_schema?? : TANG
? plan_hash????? : 1246238126
? plan_hash_2??? : 632309206
? Outline Data:
? /*+
??? BEGIN_OUTLINE_DATA
????? IGNORE_OPTIM_EMBEDDED_HINTS
????? OPTIMIZER_FEATURES_ENABLE('11.2.0.3')
????? DB_VERSION('11.2.0.3')
????? ALL_ROWS
????? OUTLINE_LEAF(@"SEL$1")
????? FULL(@"SEL$1" "O"@"SEL$1")
????? INDEX(@"SEL$1" "T"@"SEL$1" ("T12"."OWNER"))
????? LEADING(@"SEL$1" "O"@"SEL$1" "T"@"SEL$1")
????? USE_NL(@"SEL$1" "T"@"SEL$1")
??? END_OUTLINE_DATA
? */
?
從上面的跟蹤日志中可以看到,最后的執(zhí)行計(jì)劃和在SQLPLUS 中是一致的。




--------------------------------------------------------------------------------------------------
4.當(dāng)統(tǒng)計(jì)信息不準(zhǔn)確時(shí),CBO可能產(chǎn)生錯(cuò)誤的執(zhí)行計(jì)劃,請給出這樣的一個(gè)例子,
在10053 trace中找到CBO出錯(cuò)的位置,并給出必要的文字說明。<br>


C:\Users\Administrator>sqlplus tang/tang@orcl

SQL*Plus: Release 11.2.0.1.0 Production on Fri Dec 20 13:35:09 2013

Copyright (c) 1982, 2010, Oracle.? All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> drop table t12;

Table dropped.

SQL> create table t12 as select * from dba_objects;

Table created.

SQL> create index idx_t12_id on t12(object_id);

Index created.

SQL> select count(0) from t12;

? COUNT(0)
----------
???? 76438

SQL> update t12 set object_id=1 where object_id<=70000;

69175 rows updated.

SQL> update t12 set object_id=2 where object_id>70000;

7256 rows updated.

SQL> execute dbms_stats.gather_table_stats(user,'T12',CASCADE=>TRUE,ESTIMATE_PERCENT=>NULL,METHOD_OPT=>'for all columns size 254');

PL/SQL procedure successfully completed.

SQL>

SQL> select count(object_name) from t12 where object_id=1;

Execution Plan
----------------------------------------------------------
Plan hash value: 4279859672

---------------------------------------------------------------------------
| Id? | Operation????????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |
---------------------------------------------------------------------------
|?? 0 | SELECT STATEMENT?? |????? |???? 1 |??? 28 |?? 305?? (1)| 00:00:04 |
|?? 1 |? SORT AGGREGATE??? |????? |???? 1 |??? 28 |??????????? |????????? |
|*? 2 |?? TABLE ACCESS FULL| T12? | 69175 |? 1891K|?? 305?? (1)| 00:00:04 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

?? 2 - filter("OBJECT_ID"=1)

SQL> select count(object_name) from t12 where object_id=2;

Execution Plan
----------------------------------------------------------
Plan hash value: 3968484635

-------------------------------------------------------------------------------------------
| Id? | Operation??????????????????? | Name?????? | Rows? | Bytes | Cost (%CPU)| Time???? |
-------------------------------------------------------------------------------------------
|?? 0 | SELECT STATEMENT???????????? |??????????? |???? 1 |??? 28 |?? 129?? (0)| 00:00:02 |
|?? 1 |? SORT AGGREGATE????????????? |??????????? |???? 1 |??? 28 |??????????? |????????? |
|?? 2 |?? TABLE ACCESS BY INDEX ROWID| T12??????? |? 7256 |?? 198K|?? 129?? (0)| 00:00:02 |
|*? 3 |??? INDEX RANGE SCAN????????? | IDX_T12_ID |? 7256 |?????? |??? 25?? (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

?? 3 - access("OBJECT_ID"=2)

SQL>

上面表中數(shù)據(jù) OBJECT_ID=1 時(shí),數(shù)據(jù)有69175 ,OBJECT_ID=2 時(shí),數(shù)據(jù)有7256;

從上面的執(zhí)行計(jì)劃可以看出,第一個(gè)使用了全表搜索,第二個(gè)查詢使用了索引,是正確的。
因?yàn)橄葟乃饕胁檎?ojbect_id=2 的數(shù)據(jù)比較少,走索引,再到表中查找數(shù)據(jù),速度更快。


下面我們對數(shù)據(jù)進(jìn)行一個(gè)修正。把OBJECT_ID 的分布進(jìn)行修改。



SQL> set autot off;
SQL> update t12 set object_id=3 where rownum<=60000;

60000 rows updated.

SQL> select count(0) from t12 where object_id=1;

? COUNT(0)
----------
????? 9207

SQL> set autot trace expl;
SQL> select count(object_name) from t12 where object_id=1;

Execution Plan
----------------------------------------------------------
Plan hash value: 4279859672

---------------------------------------------------------------------------
| Id? | Operation????????? | Name | Rows? | Bytes | Cost (%CPU)| Time???? |
---------------------------------------------------------------------------
|?? 0 | SELECT STATEMENT?? |????? |???? 1 |??? 28 |?? 305?? (1)| 00:00:04 |
|?? 1 |? SORT AGGREGATE??? |????? |???? 1 |??? 28 |??????????? |????????? |
|*? 2 |?? TABLE ACCESS FULL| T12? | 69175 |? 1891K|?? 305?? (1)| 00:00:04 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

?? 2 - filter("OBJECT_ID"=1)

SQL>

經(jīng)修改后,object_id=1 的數(shù)據(jù)只有 9207,在表中的分布應(yīng)該是很少了。應(yīng)該走索引才對。
這就是因?yàn)楸碇械慕y(tǒng)計(jì)信息已不正確的原因。從上面的執(zhí)行計(jì)劃也可以看出,執(zhí)行計(jì)劃中統(tǒng)計(jì)出的
數(shù)據(jù)行數(shù) :69175 就是在修改前的OBJECT_ID=1 的數(shù)量。

我們來跟蹤一下10053的跟蹤日志。查找原因。


**************************
Predicate Move-Around (PM)
**************************
PM:???? PM bypassed: Outer query contains no views.
PM:???? PM bypassed: Outer query contains no views.
query block SEL$1 (#0) unchanged
FPD: Considering simple filter push in query block SEL$1 (#0)
"T12"."OBJECT_ID"=:B1
try to generate transitive predicate from check constraints for query block SEL$1 (#0)
finally: "T12"."OBJECT_ID"=:B1

apadrv-start sqlid=7904889763193459797
? :
??? call(in-use=1520, alloc=16344), compile(in-use=55176, alloc=57056), execution(in-use=3296, alloc=4032)

*******************************************
Peeked values of the binds in SQL statement
*******************************************
----- Bind Info (kkscoacd) -----
?Bind#0
? oacdty=02 mxl=22(02) mxlc=00 mal=00 scl=00 pre=00
? oacflg=10 fl2=0100 frm=00 csi=00 siz=24 off=0
? kxsbbbfp=ae8c6460? bln=22? avl=02? flg=09
? value=1

Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT("T12"."OBJECT_NAME") "COUNT(OBJECT_NAME)" FROM "TANG"."T12" "T12" WHERE "T12"."OBJECT_ID"=:B1
kkoqbc: optimizing query block SEL$1 (#0)
?????? ?
??????? :
??? call(in-use=1568, alloc=16344), compile(in-use=56104, alloc=57056), execution(in-use=3432, alloc=4032)

kkoqbc-subheap (create addr=0x000000001819A658)
****************
QUERY BLOCK TEXT
****************
select count(object_name) from t12 where object_id=:"SYS_B_0"
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (optimizer): qb_name=SEL$1 nbfros=1 flg=0
? fro(0): flg=0 objn=98536 hint_alias="T12"@"SEL$1"

-----------------------------
SYSTEM STATISTICS INFORMATION
-----------------------------
? Using NOWORKLOAD Stats
? CPUSPEEDNW: 1720 millions instructions/sec (default is 100)
? IOTFRSPEED: 4096 bytes per millisecond (default is 4096)
? IOSEEKTIM:? 10 milliseconds (default is 10)
? MBRC:?????? NO VALUE blocks (default is 8)

***************************************
BASE STATISTICAL INFORMATION
***********************
Table Stats::
? Table: T12? Alias: T12
??? #Rows: 76438? #Blks:? 1115? AvgRowLen:? 96.00? ChainCnt:? 0.00

?? ?#行數(shù) 塊數(shù) 平均行長
Index Stats::
? Index: IDX_T12_ID? Col#: 4
??? LVLS: 1? #LB: 263? #DK: 2? LB/K: 131.00? DB/K: 545.00? CLUF: 1091.00

#索引幾層葉子塊數(shù)多少個(gè)唯一鍵值每個(gè)鍵值有多少個(gè)葉塊每個(gè)鍵值有多少個(gè)數(shù)據(jù)塊聚簇因子

Access path analysis for T12
***************************************
SINGLE TABLE ACCESS PATH
? Single Table Cardinality Estimation for T12[T12]
? Column (#4):
??? NewDensity:0.047468, OldDensity:0.000007 BktCnt:76431, PopBktCnt:76431, PopValCnt:2, NDV:2
? Column (#4): OBJECT_ID(
??? AvgLen: 3 NDV: 2 Nulls: 7 Density: 0.047468 Min: 1 Max: 2
??? Histogram: Freq? #Bkts: 2? UncompBkts: 76431? EndPtVals: 2

? Table: T12? Alias: T12
??? Card: Original: 76438.000000? Rounded: 69175? Computed: 69175.00? Non Adjusted: 69175.00

#原始行數(shù) 近似值 精確值 非修正值
#可以看出,問題就出在這里,ORACLE 認(rèn)為,現(xiàn)在OBJECT_ID=1 的數(shù)據(jù)就是: 69175

? Access Path: TableScan 全表掃描代價(jià)
??? Cost:? 305.35? Resp: 305.35? Degree: 0
????? Cost_io: 304.00? Cost_cpu: 27814286
????? Resp_io: 304.00? Resp_cpu: 27814286
? Access Path: index (AllEqRange)? 索引全掃描代價(jià)
??? Index: IDX_T12_ID
??? resc_io: 1227.00? resc_cpu: 37100607
??? ix_sel: 0.905065? ix_sel_with_filters: 0.905065

?? ?#ix_sel 索引選擇率
?? ?#ix_sel_with_filters帶過濾條件索引選擇率
?? ?#這里也可以看出,ORACLE認(rèn)為索引選擇率很高

??? Cost: 1228.80? Resp: 1228.80? Degree: 1
? Best:: AccessPath: TableScan
???????? Cost: 305.35? Degree: 1? Resp: 305.35? Card: 69175.00? Bytes: 0

得出結(jié)論走全表搜索優(yōu)于索引

***************************************


OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***************************************
Considering cardinality-based initial join order.
Permutations for Starting Table :0
Join order[1]:? T12[T12]#0
***********************
Best so far:? Table#: 0? cost: 305.3474? card: 69175.0000? bytes: 1936900
***********************
(newjo-stop-1) k:0, spcnt:0, perm:1, maxperm:2000

*********************************
Number of join permutations tried: 1
*********************************
Enumerating distribution method (advanced)

Trying or-Expansion on query block SEL$1 (#0)
Transfer Optimizer annotations for query block SEL$1 (#0)
id=0 frofand predicate="T12"."OBJECT_ID"=:B1
Final cost for query block SEL$1 (#0) - All Rows Plan:
? Best join order: 1
? Cost: 305.3474? Degree: 1? Card: 69175.0000? Bytes: 1936900
? Resc: 305.3474? Resc_io: 304.0000? Resc_cpu: 27814286
? Resp: 305.3474? Resp_io: 304.0000? Resc_cpu: 27814286
kkoqbc-subheap (delete addr=0x000000001819A658, in-use=13600, alloc=16408)
kkoqbc-end:
??????? :
??? call(in-use=29304, alloc=49184), compile(in-use=57072, alloc=61200), execution(in-use=3800, alloc=4032)

kkoqbc: finish optimizing query block SEL$1 (#0)
apadrv-end
????????? :
??? call(in-use=29304, alloc=49184), compile(in-use=57984, alloc=61200), execution(in-use=3800, alloc=4032)


Starting SQL statement dump

user_id=84 user_name=TANG module=SQL*Plus action=
sql_id=6vcygbf9w952p plan_hash_value=-15107624 problem_type=3
----- Current SQL Statement for this session (sql_id=6vcygbf9w952p) -----
?select count(object_name) from t12 where object_id=:"SYS_B_0"
sql_text_length=63
sql= select count(object_name) from t12 where object_id=:"SYS_B_0"
----- Explain Plan Dump -----
----- Plan Table -----
?
============
Plan Table
============
--------------------------------------+-----------------------------------+
| Id? | Operation?????????? | Name??? | Rows? | Bytes | Cost? | Time????? |
--------------------------------------+-----------------------------------+
| 0?? | SELECT STATEMENT??? |???????? |?????? |?????? |?? 305 |?????????? |
| 1?? |? SORT AGGREGATE???? |???????? |???? 1 |??? 28 |?????? |?????????? |
| 2?? |?? TABLE ACCESS FULL | T12???? |?? 68K | 1892K |?? 305 |? 00:00:04 |
--------------------------------------+-----------------------------------+
Predicate Information:
----------------------
2 - filter("OBJECT_ID"=:SYS_B_0)
?
Content of other_xml column
===========================
? db_version???? : 11.2.0.3
? parse_schema?? : TANG
? plan_hash????? : 4279859672
? plan_hash_2??? : 3898508299
Peeked Binds
============
? Bind variable information
??? position=1
??? datatype(code)=2
??? datatype(string)=NUMBER
??? precision=0
??? scale=0
??? max length=22
??? value=1
? Outline Data:
? /*+
??? BEGIN_OUTLINE_DATA
????? IGNORE_OPTIM_EMBEDDED_HINTS
????? OPTIMIZER_FEATURES_ENABLE('11.2.0.3')
????? DB_VERSION('11.2.0.3')
????? ALL_ROWS
????? OUTLINE_LEAF(@"SEL$1")
????? FULL(@"SEL$1" "T12"@"SEL$1")
??? END_OUTLINE_DATA
? */
?

總結(jié)

以上是生活随笔為你收集整理的【性能优化】 之 10053 事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。