32個位元組限制——Oracle長條圖最佳化

來源:互聯網
上載者:User

Oracle長條圖的限制往往讓不少初學者頭痛——超過32位元組不顯示,以及前32位元組相同產生錯誤。

由於OBJECT_TYPE列上的DISTINCT值的個數小於254,ORACLE將會在此列上建立頻率長條圖,最佳化器將會準確的估算出CONTENTS='TABLE'的查詢返回37條記錄。

下面看看如下的情況:

SQL> TRUNCATE TABLE T;

Table truncated.

SQL> SET AUTOT OFF
SQL> INSERT INTO T
  2  SELECT ROWNUM,OBJECT_NAME,RPAD('*',32,'*')||OBJECT_TYPE
  3  FROM ALL_OBJECTS WHERE ROWNUM<=10000;

10000 rows created.

SQL> COMMIT;

Commit complete.

SQL> SELECT COUNT(1) FROM T;

  COUNT(1)
----------
     10000

SQL> SELECT CONTENTS ,COUNT(1) FROM T GROUP BY CONTENTS ;

CONTENTS                                             COUNT(1)
-------------------------------------------------- ----------
********************************SEQUENCE                    1
********************************LIBRARY                     3
********************************WINDOW GROUP                1
********************************INDEX PARTITION           347
********************************PACKAGE                   164
********************************SCHEDULE                    1
********************************TABLE PARTITION            25
********************************VIEW                     1150
********************************TABLE                      37
********************************PROCEDURE                  11
********************************CONSUMER GROUP              2
********************************INDEX SUBPARTITION       3328
********************************OPERATOR                   15
********************************WINDOW                      2
********************************INDEX                      34
********************************FUNCTION                   60
********************************SYNONYM                  2552
********************************TABLE SUBPARTITION       1714
********************************TYPE                      538
********************************JOB CLASS                   1
********************************PACKAGE BODY               13
********************************EVALUATION CONTEXT          1

22 rows selected.


SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER,'T',method_opt=>'FOR COLUMNS CONTENTS SIZE 254');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM T WHERE CONTENTS='********************************TABLE';

Execution Plan
----------------------------------------------------------
Plan hash value: 2153619298

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 10000 |   654K|    24   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    | 10000 |   654K|    24   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - filter("CONTENTS"='********************************TABLE')


由於CONTENTS列的前32位都一樣,ORACLE在收集統計資訊長條圖的時候只考慮前32位,這會導致ORACLE認為
所有的記錄的列CONTENTS都是相同的,因此最佳化器估算返回的行數為10000。

 

SQL> UPDATE T SET CONTENTS=SUBSTR(CONTENTS,2);

10000 rows updated.

SQL> COMMIT;

Commit complete.

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER,'T',method_opt=>'FOR COLUMNS CONTENTS SIZE 254');

PL/SQL procedure successfully completed.

SQL> SELECT CONTENTS ,COUNT(1) FROM T GROUP BY CONTENTS ORDER BY 1;

CONTENTS                                             COUNT(1)
-------------------------------------------------- ----------
*******************************CONSUMER GROUP               2
*******************************EVALUATION CONTEXT           1
*******************************FUNCTION                    60
*******************************INDEX                       34
*******************************INDEX PARTITION            347
*******************************INDEX SUBPARTITION        3328
*******************************JOB CLASS                    1
*******************************LIBRARY                      3
*******************************OPERATOR                    15
*******************************PACKAGE                    164
*******************************PACKAGE BODY                13
*******************************PROCEDURE                   11
*******************************SCHEDULE                     1
*******************************SEQUENCE                     1
*******************************SYNONYM                   2552
*******************************TABLE                       37
*******************************TABLE PARTITION             25
*******************************TABLE SUBPARTITION        1714
*******************************TYPE                       538
*******************************VIEW                      1150
*******************************WINDOW                       2
*******************************WINDOW GROUP                 1

SQL> SELECT SUBSTR(CONTENTS,1,32),COUNT(1) FROM T GROUP BY SUBSTR(CONTENTS,1,32);

SUBSTR(CONTENTS,1,32)                      COUNT(1)
---------------------------------------- ----------
*******************************E                  1
*******************************J                  1
*******************************P                188
*******************************C                  2
*******************************S               2554
*******************************T               2314
*******************************F                 60
*******************************O                 15
*******************************L                  3
*******************************W                  3
*******************************I               3709
*******************************V               1150

12 rows selected.

 


SQL> SET AUTOT TRACEONLY EXP
SQL> SELECT * FROM T WHERE CONTENTS='*******************************TABLE';

Execution Plan
----------------------------------------------------------
Plan hash value: 2153619298

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |  2314 |   149K|    24   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    |  2314 |   149K|    24   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - filter("CONTENTS"='*******************************TABLE')

SQL> SELECT * FROM T WHERE CONTENTS='*******************************TYPE';

Execution Plan
----------------------------------------------------------
Plan hash value: 2153619298

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |  2314 |   149K|    24   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    |  2314 |   149K|    24   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - filter("CONTENTS"='*******************************TYPE')


從上面可以看出,ORACLE只考慮前32個位元組,下面每一個值查詢的估算行數都是等於3者實際記錄數之和。

*******************************TABLE                       37
*******************************TABLE PARTITION             25
*******************************TABLE SUBPARTITION        1714
*******************************TYPE                       538

更多Oracle相關資訊見Oracle 專題頁面 http://www.bkjia.com/topicnews.aspx?tid=12

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.