Oracle 12c新特性之检测有用的多列统计信息

    之前和大家分享过Oracle 11g下的一个新特性——收集多列统计信息(http://blog.itpub.net/30162081/viewspace-1637387/),今天和大家分享Oracle 12c的一个新特性——自动检测有用列组信息。二者相得益彰,大家可以具体情况酌情使用。
   言归正传,我们可以针对一个表,基于特 定的工作负荷,通过使用DBMS_STATS.SEED_COL_USAGE和REPORT_COL_USAGE来确定我们需要哪些列组。当你不清除需要创建哪个扩展统计信息时,这个技术是非常有用的。需要注意的是,这种技术不适用于包含表达式列的统计工作。
   接下来,我们通过例子来学习这个的新特性。

1.环境准备

首先,我们创建测试表 customers_test,基于sh示例用户下的customers表。

点击(此处)折叠或打开

  1. SQL> select banner from v$version;

  2. BANNER
  3. --------------------------------------------------------------------------------
  4. Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
  5. PL/SQL Release 12.1.0.2.0 - Production
  6. CORE    12.1.0.2.0    Production
  7. TNS for Linux: Version 12.1.0.2.0 - Production
  8. NLSRTL Version 12.1.0.2.0 - Production

  9. SQL>
  10. SQL> conn sh/sh@HOEGH
  11. Connected.
  12. SQL>
  13. SQL> DROP TABLE customers_test;
  14. DROP TABLE customers_test
  15.            *
  16. ERROR at line 1:
  17. ORA-00942: table or view does not exist


  18. SQL> CREATE TABLE customers_test AS SELECT * FROM customers;

  19. Table created.

  20. SQL> select count(*) from customers_test;

  21.   COUNT(*)
  22. ----------
  23.      55500

  24. SQL>

2.收集统计信息

点击(此处)折叠或打开

  1. SQL>
  2. SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(user, 'customers_test');

  3. PL/SQL procedure successfully completed.

  4. SQL>

3.开启负载监控

另外打开一个会话,通过sys用户登录,开启负载监控。其中, SEED_COL_USAGE的第三个参数表示监控的时间,单位是秒,300表示5分钟。

点击(此处)折叠或打开

  1. SQL> show user
  2. USER is “SYS”
  3. SQL> BEGIN
  4.   DBMS_STATS.SEED_COL_USAGE(null,null,300);
  5. END;
  6. / 2 3 4

  7. PL/SQL procedure successfully completed.
  8. SQL>

4.使用explain plan for查询执行计划

点击(此处)折叠或打开

  1. SQL>
  2. SQL> EXPLAIN PLAN FOR
  3.   SELECT *
  4.   FROM customers_test
  5.   WHERE cust_city = 'Los Angeles'
  6.   AND cust_state_province = 'CA'
  7.   AND country_id = 52790; 2 3 4 5 6

  8. Explained.

  9. SQL>
  10. SQL> SELECT PLAN_TABLE_OUTPUT
  11. FROM TABLE(DBMS_XPLAN.DISPLAY('plan_table', null,'basic rows')); 2

  12. PLAN_TABLE_OUTPUT
  13. --------------------------------------------------------------------------------
  14. Plan hash value: 2112738156

  15. ----------------------------------------------------
  16. | Id | Operation     | Name     | Rows |
  17. ----------------------------------------------------
  18. | 0 | SELECT STATEMENT |         |     1 |
  19. | 1 | TABLE ACCESS FULL| CUSTOMERS_TEST |     1 |
  20. ----------------------------------------------------

  21. 8 rows selected.

  22. SQL>
从执行计划来看,查询结果只有1列。我们暂且记下这个结果。

5.查看列使用信息

此时,我们可以通过REPORT_COL_USAGE来查看列的使用信息。
我们看到,Oracle帮我们检测到了一个有用的列组信息,包括 customers_test、 cust_city和cust_state_province三列。

点击(此处)折叠或打开

  1. SQL>
  2. SQL> SET LONG 100000
  3. SQL> SET LINES 120
  4. SQL> SET PAGES 0
  5. SQL> SELECT DBMS_STATS.REPORT_COL_USAGE(user, 'customers_test')
  6.   2 FROM DUAL;
  7. LEGEND:
  8. .......

  9. EQ     : Used in single table EQuality predicate
  10. RANGE     : Used in single table RANGE predicate
  11. LIKE     : Used in single table LIKE predicate
  12. NULL     : Used in single table is (not) NULL predicate
  13. EQ_JOIN : Used in EQuality JOIN predicate
  14. NONEQ_JOIN : Used in NON EQuality JOIN predicate
  15. FILTER     : Used in single table FILTER predicate
  16. JOIN     : Used in JOIN predicate
  17. GROUP_BY : Used in GROUP BY expression
  18. ...............................................................................

  19. ###############################################################################

  20. COLUMN USAGE REPORT FOR SH.CUSTOMERS_TEST
  21. .........................................

  22. 1. COUNTRY_ID             : EQ
  23. 2. CUST_CITY             : EQ
  24. 3. CUST_STATE_PROVINCE         : EQ
  25. 4. (CUST_CITY, CUST_STATE_PROVINCE,
  26.     COUNTRY_ID)          : FILTER
  27. ###############################################################################



  28. SQL>

6.创建扩展统计信息

检测工作完成后,我们可以通过CREATE_EXTENDED_STATS方法来创建扩展统计信息。其中,黄色标注部分就是创建对象的名称。

点击(此处)折叠或打开

  1. SQL>
  2. SQL> SELECT DBMS_STATS.CREATE_EXTENDED_STATS(user, 'customers_test') FROM DUAL;
  3. ###############################################################################

  4. EXTENSIONS FOR SH.CUSTOMERS_TEST
  5. ................................

  6. 1. (CUST_CITY, CUST_STATE_PROVINCE,
  7.     COUNTRY_ID)          : SYS_STUMZ$C3AIHLPBROI#SKA58H_N created
  8. ###############################################################################



  9. SQL>

7.重新收集统计信息

点击(此处)折叠或打开

  1. SQL>
  2. SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(user,'customers_test');

  3. PL/SQL procedure successfully completed.

  4. SQL>

8.查看USER_TAB_COL_STATISTICS,确认列统计信息

通过查询 USER_TAB_COL_STATISTICS,我们可以获取到刚刚创建的列组对象,和第6步的输出结果是一致的。

点击(此处)折叠或打开

  1. SQL>
  2. SQL> COL COLUMN_NAME FOR A30
  3. SQL> SELECT COLUMN_NAME, NUM_DISTINCT, HISTOGRAM
  4. FROM USER_TAB_COL_STATISTICS
  5. WHERE TABLE_NAME = 'CUSTOMERS_TEST'
  6. ORDER BY 1; 2 3 4
  7. COUNTRY_ID                 19 FREQUENCY
  8. CUST_CITY                620 HYBRID
  9. CUST_CITY_ID                620 NONE
  10. CUST_CREDIT_LIMIT             8 NONE
  11. CUST_EFF_FROM                 1 NONE
  12. CUST_EFF_TO                 0 NONE
  13. CUST_EMAIL             1699 NONE
  14. CUST_FIRST_NAME          1300 NONE
  15. CUST_GENDER                 2 NONE
  16. CUST_ID              55500 NONE
  17. CUST_INCOME_LEVEL             12 NONE
  18. CUST_LAST_NAME                908 NONE
  19. CUST_MAIN_PHONE_NUMBER         51344 NONE
  20. CUST_MARITAL_STATUS             11 NONE
  21. CUST_POSTAL_CODE            623 NONE
  22. CUST_SRC_ID                 0 NONE
  23. CUST_STATE_PROVINCE            145 FREQUENCY
  24. CUST_STATE_PROVINCE_ID            145 NONE
  25. CUST_STREET_ADDRESS         49900 NONE
  26. CUST_TOTAL                 1 NONE
  27. CUST_TOTAL_ID                 1 NONE
  28. CUST_VALID                 2 NONE
  29. CUST_YEAR_OF_BIRTH             75 NONE
  30. SYS_STUMZ$C3AIHLPBROI#SKA58H_N        620 HYBRID

  31. 24 rows selected.

  32. SQL>

9.重新查询执行计划

我们看到,在第4步中查询执行计划中,Rows为1;现在呢,是867。这差距也忒大了点儿。

点击(此处)折叠或打开

  1. SQL>
  2. SQL> EXPLAIN PLAN FOR
  3.   SELECT *
  4.   FROM customers_test
  5.   WHERE cust_city = 'Los Angeles'
  6.   AND cust_state_province = 'CA'
  7.   AND country_id = 52790; 2 3 4 5 6

  8. Explained.

  9. SQL>
  10. SQL> SELECT PLAN_TABLE_OUTPUT
  11. FROM TABLE(DBMS_XPLAN.DISPLAY('plan_table', null,'basic rows')); 2
  12. Plan hash value: 2112738156

  13. ----------------------------------------------------
  14. | Id | Operation     | Name     | Rows |
  15. ----------------------------------------------------
  16. | 0 | SELECT STATEMENT |         | 867 |
  17. | 1 | TABLE ACCESS FULL| CUSTOMERS_TEST | 867 |
  18. ----------------------------------------------------

  19. 8 rows selected.

  20. SQL>

~~~~~~~ the end~~~~~~~~~
hoegh
2016.09.07

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30162081/viewspace-2124652/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30162081/viewspace-2124652/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值