Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

1

主题
1#
发表于 2013-3-14 16:19:55 | 查看: 5681| 回复: 7
最近在了解CBO生成执行计划的过程中,对10053跟踪的结果中路径选择的成本估算有些不能理解,望各位大神给解读一下


SINGLE TABLE ACCESS PATH
  Single Table Cardinality Estimation for AU_PARTYRELATION[AU_PARTYRELATION]
  Column (#7):
    NewDensity:0.000629, OldDensity:0.009560 BktCnt:75, PopBktCnt:64, PopValCnt:22, NDV:255
  Column (#7): CODE(
    AvgLen: 46 NDV: 255 Nulls: 0 Density: 0.000629
    Histogram: HtBal  #Bkts: 75  UncompBkts: 75  EndPtVals: 34
  
Table: AU_PARTYRELATION  Alias: AU_PARTYRELATION
    Card: Original: 149622.000000  Rounded: 9975  Computed: 9974.80  Non Adjusted: 9974.80  
Access Path: TableScan
    Cost:  1669.35  Resp: 1669.35  Degree: 0
      Cost_io: 1665.00  Cost_cpu: 91832667
      Resp_io: 1665.00  Resp_cpu: 91832667
kkofmx: index filter:"AU_PARTYRELATION"."CODE"='1099100400000000001000010007300026000260000100001'

其中这个Rounded值是如何估算出来的?

rmrs_ora_7958.txt

69.29 KB, 下载次数: 804

10053 trace文件

2#
发表于 2013-3-14 16:53:54
AU_PARTYRELATION 表的ddl和 以下信息也 发一下

SQL> select  *  from dba_tab_cols where TABLE_NAME='AU_PARTYRELATION' and COLUMN_NAME='CODE';

回复 只看该作者 道具 举报

3#
发表于 2013-3-14 17:11:57
DDL
CREATE TABLE "RRSP"."AU_PARTYRELATION"
   (        "ID" CHAR(19) NOT NULL ENABLE,
        "RELATIONTYPE_ID" CHAR(19),
        "RELATIONTYPE_KEYWORD" VARCHAR2(300),
        "PARENT_CODE" VARCHAR2(300),
        "PARENT_PARTYID" CHAR(19),
        "PARTYID" CHAR(19),
        "CODE" VARCHAR2(300),
        "NAME" VARCHAR2(1000),
        "PARTYTYPE_ID" VARCHAR2(19),
        "TYPE_LEVEL" NUMBER(3,0),
        "ORDER_CODE" VARCHAR2(300),
        "IS_LEAF" CHAR(1) DEFAULT '0' NOT NULL ENABLE,
        "TYPE_IS_LEAF" CHAR(1) DEFAULT '0' NOT NULL ENABLE,
        "IS_INHERIT" CHAR(1) DEFAULT '1' NOT NULL ENABLE,
        "IS_CHIEF" CHAR(1) DEFAULT '1' NOT NULL ENABLE,
        "EMAIL" VARCHAR2(300),
        "CREATE_DATE" DATE DEFAULT SYSDATE NOT NULL ENABLE,
        "MODIFY_DATE" DATE
   )

行统计信息
           OWNER        TABLE_NAME        COLUMN_NAME        DATA_TYPE        DATA_TYPE_MOD        DATA_TYPE_OWNER        DATA_LENGTH        DATA_PRECISION        DATA_SCALE        NULLABLE        COLUMN_ID        DEFAULT_LENGTH        DATA_DEFAULT        NUM_DISTINCT        LOW_VALUE        HIGH_VALUE        DENSITY        NUM_NULLS        NUM_BUCKETS        LAST_ANALYZED        SAMPLE_SIZE        CHARACTER_SET_NAME        CHAR_COL_DECL_LENGTH        GLOBAL_STATS        USER_STATS        AVG_COL_LEN        CHAR_LENGTH        CHAR_USED        V80_FMT_IMAGE        DATA_UPGRADED        HIDDEN_COLUMN        VIRTUAL_COLUMN        SEGMENT_COLUMN_ID        INTERNAL_COLUMN_ID        HISTOGRAM        QUALIFIED_COL_NAME
        RRSP        AU_PARTYRELATION        CODE        VARCHAR2                        300                        Y        7                        258        313039393130303430303030303030303030313030303031        313039393130303430303030303030303030333030303031        0.010947249        0        75        2013-3-14 17:04:22        149866        CHAR_CS        300        YES        NO        46        300        B        NO        YES        NO        NO        7        7        HEIGHT BALANCED        CODE


回复 只看该作者 道具 举报

4#
发表于 2013-3-14 20:41:24
some test
  1. Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
  2. With the Partitioning, OLAP, Data Mining and Real Application Testing options

  3. SQL>
  4. SQL> conn maclean/maclean
  5. Connected.


  6. DROP TABLE tab1;
  7. DROP TABLE tab2;


  8. create table tab_simple as select rownum t1 from dual connect by level<=10000;

  9. exec dbms_stats.gather_table_stats(user,'TAB_SIMPLE');

  10.   
  11. alter session set events '10053 trace name context forever,level 1';

  12. SQL> select /*+ maclean */  1 from tab_simple where t1=10;

  13.          1
  14. ----------
  15.          1


  16. alter session set events '10053 trace name context off';        
  17.                  
  18.   ***************************************
  19. SINGLE TABLE ACCESS PATH
  20.   -----------------------------------------
  21.   BEGIN Single Table Cardinality Estimation
  22.   -----------------------------------------
  23.   Column (#1): T1(NUMBER)
  24.     AvgLen: 4.00 NDV: 10000 Nulls: 0 Density: 1.0000e-04 Min: 1 Max: 10000
  25.   Table: TAB_SIMPLE  Alias: TAB_SIMPLE
  26.     Card: Original: 10000  Rounded: 1  Computed: 1.00  Non Adjusted: 1.00
  27.        
  28.        
  29. 没有histogram 的情况下  :


  30. 计算基数= 原始基数 * SEL 选择率

  31. A4Null = (原始基数 - Nnulls)/ 原始基数


  32. 等式谓词情况下:

  33. 选择性= (1/NDV) *         A4Null


  34. 在上述例子中 是   10000  *  (1/10000) = 1



  35. exec dbms_stats.gather_table_stats(user,'TAB_SIMPLE',method_opt=>'FOR ALL COLUMNS SIZE 254');

  36. alter session set events '10053 trace name context forever,level 1';
  37. select /*+ maclean1 */  2 from tab_simple where t1=10;
  38. alter session set events '10053 trace name context off';     
  39.        
  40.        
  41.        
  42.        
  43. SINGLE TABLE ACCESS PATH
  44.   -----------------------------------------
  45.   BEGIN Single Table Cardinality Estimation
  46.   -----------------------------------------
  47.   Column (#1): T1(NUMBER)
  48.     AvgLen: 4.00 NDV: 10000 Nulls: 0 Density: 1.0000e-04 Min: 1 Max: 10000
  49.     Histogram: HtBal  #Bkts: 254  UncompBkts: 254  EndPtVals: 255
  50.   Table: TAB_SIMPLE  Alias: TAB_SIMPLE
  51.     Card: Original: 10000  Rounded: 1  Computed: 1.00  Non Adjusted: 1.00
  52.        
  53.        
  54.        
  55.        
  56.        
  57. 单表 + 等式谓词  + 高度平衡直方图

  58. 计算基数= 原始基数 * SEL 选择率


  59. NewDensity /* 10.2.0.4 and 11g */
  60. = (Buckets_total - Buckets_all_popular_values) / Buckets_total
  61. / (NDV - popular_values.COUNT)


  62. 对于非popular 值 其SEL 选择率= Density * A4Nulls  =1.0000e-04






  63. SQL> insert into tab_simple select  99999999 from dual connect by level <=30000;

  64. 30000 rows created.

  65. SQL> commit;

  66. Commit complete.

  67. exec dbms_stats.gather_table_stats(user,'TAB_SIMPLE',method_opt=>'FOR ALL COLUMNS SIZE 254');

  68. alter session set events '10053 trace name context forever,level 1';
  69. select /*+ maclean2 */  3 from tab_simple where t1=99999999;
  70. alter session set events '10053 trace name context off';     
  71.        
  72. DBA_TAB_HISTOGRAMS

  73. SINGLE TABLE ACCESS PATH
  74.   -----------------------------------------
  75.   BEGIN Single Table Cardinality Estimation
  76.   -----------------------------------------
  77.   Column (#1): T1(NUMBER)
  78.     AvgLen: 6.00 NDV: 9857 Nulls: 0 Density: 2.5166e-05 Min: 5 Max: 99999999
  79.     Histogram: HtBal  #Bkts: 254  UncompBkts: 254  EndPtVals: 65
  80.   Table: TAB_SIMPLE  Alias: TAB_SIMPLE
  81.     Card: Original: 39738  Rounded: 29804  Computed: 29803.50  Non Adjusted: 29803.50
  82.        

  83.        
  84.        
  85.         sel =   round(1- 65/254) * 39738=  0.75 * 39738= 29803.50
  86.        
  87.        
  88.         insert into tab_simple select  7777777777 from dual connect by level <=60000;
  89.         commit;
  90.        
  91.          exec dbms_stats.gather_table_stats(user,'TAB_SIMPLE',method_opt=>'FOR ALL COLUMNS SIZE 254');
  92.        
  93. alter session set events '10053 trace name context forever,level 1';
  94. select /*+ maclean3 */  4 from tab_simple where t1=7777777777;
  95. alter session set events '10053 trace name context off';     
  96.        
  97. SQL>            select column_name,ENDPOINT_NUMBER,ENDPOINT_VALUE from dba_tab_histograms where table_name='TAB_SIMPLE';

  98. COLUM ENDPOINT_NUMBER ENDPOINT_VALUE
  99. ----- --------------- --------------
  100. T1                  0              1
  101. T1                  1            394
  102. T1                  2            788
  103. T1                  3           1182
  104. T1                  4           1576
  105. T1                  5           1970
  106. T1                  6           2364
  107. T1                  7           2758
  108. T1                  8           3152
  109. T1                  9           3546
  110. T1                 10           3940

  111. COLUM ENDPOINT_NUMBER ENDPOINT_VALUE
  112. ----- --------------- --------------
  113. T1                 11           4334
  114. T1                 12           4728
  115. T1                 13           5122
  116. T1                 14           5516
  117. T1                 15           5910
  118. T1                 16           6304
  119. T1                 17           6698
  120. T1                 18           7092
  121. T1                 19           7486
  122. T1                 20           7880
  123. T1                 21           8274

  124. COLUM ENDPOINT_NUMBER ENDPOINT_VALUE
  125. ----- --------------- --------------
  126. T1                 22           8668
  127. T1                 23           9062
  128. T1                 24           9456
  129. T1                 25           9850
  130. T1                101       99999999
  131. T1                254     7777777777

  132.        
  133. Table Stats::
  134.   Table: TAB_SIMPLE  Alias: TAB_SIMPLE
  135.     #Rows: 100000  #Blks:  374  AvgRowLen:  6.00
  136. ***************************************
  137. SINGLE TABLE ACCESS PATH
  138.   -----------------------------------------
  139.   BEGIN Single Table Cardinality Estimation
  140.   -----------------------------------------
  141.   Column (#1): T1(NUMBER)
  142.     AvgLen: 7.00 NDV: 10002 Nulls: 0 Density: 9.8425e-06 Min: 1 Max: 7777777777
  143.     Histogram: HtBal  #Bkts: 254  UncompBkts: 254  EndPtVals: 28
  144.   Table: TAB_SIMPLE  Alias: TAB_SIMPLE
  145.     Card: Original: 100000  Rounded: 60039  Computed: 60039.37  Non Adjusted: 60039.37
  146.        
  147.                 sel =   round(1- 101/254) * 100000  =  60236.22047244094
  148.                
  149.                
  150.                 col column_name for a5
  151.                
  152.                 select column_name,ENDPOINT_NUMBER,ENDPOINT_VALUE from dba_tab_histograms where table_name='TAB_SIMPLE';
  153.                
  154.                
  155.                
  156.                
  157.        
  158.        
  159.         insert into tab_simple select  540404 from dual connect by level <=20000;
  160.         commit;
  161.        
  162.          exec dbms_stats.gather_table_stats(user,'TAB_SIMPLE',method_opt=>'FOR ALL COLUMNS SIZE 75');
  163.        
  164. alter session set events '10053 trace name context forever,level 1';
  165. select /*+ maclean3 */  5 from tab_simple where t1=540404;
  166. alter session set events '10053 trace name context off';     


  167. SQL>    select column_name,ENDPOINT_NUMBER,ENDPOINT_VALUE from dba_tab_histograms where table_name='TAB_SIMPLE';

  168. COLUM ENDPOINT_NUMBER ENDPOINT_VALUE
  169. ----- --------------- --------------
  170. T1                  0              4
  171. T1                  1           1593
  172. T1                  2           3286
  173. T1                  3           4817
  174. T1                  4           6437
  175. T1                  5           8022
  176. T1                  6           9639
  177. T1                 18         540404
  178. T1                 37       99999999
  179. T1                 75     7777777777



  180. Table Stats::
  181.   Table: TAB_SIMPLE  Alias: TAB_SIMPLE
  182.     #Rows: 120592  #Blks:  374  AvgRowLen:  6.00
  183. ***************************************
  184. SINGLE TABLE ACCESS PATH
  185.   -----------------------------------------
  186.   BEGIN Single Table Cardinality Estimation
  187.   -----------------------------------------
  188.   Column (#1): T1(NUMBER)
  189.     AvgLen: 7.00 NDV: 9650 Nulls: 0 Density: 8.2927e-06 Min: 4 Max: 7777777777
  190.     Histogram: HtBal  #Bkts: 75  UncompBkts: 75  EndPtVals: 10
  191.   Table: TAB_SIMPLE  Alias: TAB_SIMPLE
  192.     Card: Original: 120592  Rounded: 19295  Computed: 19294.72  Non Adjusted: 19294.72
  193.        
  194.        
  195.         ((18-6)/75) * 120592= 19294.72
  196.        
  197.         select /*+ maclean3 */  5 from tab_simple where t1=5;
  198.         SQL>    select /*+ maclean3 */  5 from tab_simple where t1=5;

  199.          5
  200. ----------
  201.          5


  202. Execution Plan
  203. ----------------------------------------------------------
  204. Plan hash value: 4087309527

  205. --------------------------------------------------------------------------------
  206. | Id  | Operation         | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
  207. --------------------------------------------------------------------------------
  208. |   0 | SELECT STATEMENT  |            |     1 |     6 |    85   (2)| 00:00:02 |
  209. |*  1 |  TABLE ACCESS FULL| TAB_SIMPLE |     1 |     6 |    85   (2)| 00:00:02 |
  210. --------------------------------------------------------------------------------

  211. Predicate Information (identified by operation id):
  212. ---------------------------------------------------

  213.    1 - filter("T1"=5)


  214. Statistics
  215. ----------------------------------------------------------
  216.           1  recursive calls
  217.           0  db block gets
  218.         365  consistent gets
  219.           0  physical reads
  220.           0  redo size
  221.         508  bytes sent via SQL*Net to client
  222.         492  bytes received via SQL*Net from client
  223.           2  SQL*Net roundtrips to/from client
  224.           0  sorts (memory)
  225.           0  sorts (disk)
  226.           1  rows processed
  227.         0.0000082927*120592= 1
  228.        
  229.        
  230.        
  231.        
  232.        
  233.        
  234.        
  235.        
  236.        
  237.        
复制代码

回复 只看该作者 道具 举报

5#
发表于 2013-3-14 20:44:10
149622 /15 = 9974.8

假设是popular  value ,  则

Sel = (Buckets_this_popular_value / Buckets_total) = 1/15 =  X / 75  

Buckets_this_popular_value =5

回复 只看该作者 道具 举报

6#
发表于 2013-3-14 20:44:48
                col column_name for a5
               
                select column_name,ENDPOINT_NUMBER,ENDPOINT_VALUE from dba_tab_histograms where table_name='AU_PARTYRELATION';

查一下

回复 只看该作者 道具 举报

7#
发表于 2013-3-15 15:36:48
查询结果
COLUMN_NAME        ENDPOINT_NUMBER        ENDPOINT_VALUE
CODE        0        2.55400635434556E35
CODE        1        2.55400635434556E35
CODE        2        2.55400635434556E35
CODE        8        2.55400635434556E35
CODE        10        2.55400635434556E35
CODE        11        2.55400635434556E35
CODE        12        2.55400635434556E35
CODE        15        2.55400635434556E35
CODE        16        2.55400635434556E35
CODE        17        2.55400635434556E35
CODE        20        2.55400635434556E35
CODE        21        2.55400635434556E35
CODE        24        2.55400635434556E35
CODE        25        2.55400635434556E35
CODE        27        2.55400635434556E35
CODE        30        2.55400635434556E35
CODE        32        2.55400635434556E35
CODE        35        2.55400635434556E35
CODE        37        2.55400635434556E35
CODE        39        2.55400635434556E35
CODE        41        2.55400635434556E35
CODE        45        2.55400635434556E35
CODE        46        2.55400635434556E35
CODE        49        2.55400635434556E35
CODE        51        2.55400635434556E35
CODE        55        2.55400635434556E35
CODE        58        2.55400635434556E35
CODE        60        2.55400635434556E35
CODE        64        2.55400635434556E35
CODE        65        2.55400635434556E35
CODE        66        2.55400635434556E35
CODE        71        2.55400635434556E35
CODE        72        2.55400635434556E35
CODE        73        2.55400635434556E35
CODE        74        2.55400635434556E35
CODE        75        2.55400635434556E35

回复 只看该作者 道具 举报

8#
发表于 2013-3-15 16:09:47
因为有记录更新,上面这个查询结果可能不是trace文件当时的情况,我大致明白刘大的意思了,谢谢~

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-16 08:55 , Processed in 0.094155 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569