ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 10g在cbo上的一个改进

10g在cbo上的一个改进

原创 Linux操作系统 作者:lsq_008 时间:2009-05-11 22:58:48 0 删除 编辑

表AUDIENCE的字段month_no的取值范围为1-12,如下:

SQL> select table_name,column_name,num_distinct,low_value,high_value,num_nulls from user_tab_columns where table_name='AUDIENCE';

TABLE_NAME           COLUMN_NAME          NUM_DISTINCT LOW_VALUE                HIGH_VALUE                NUM_NULLS
-------------------- -------------------- ------------ ------------------------ ------------------------ ----------
AUDIENCE             MONTH_NO                       12 C102                     C10D                              0

1 row selected.

SQL> select min(month_no),max(month_no) from audience;

MIN(MONTH_NO) MAX(MONTH_NO)
------------- -------------
            1            12

1 row selected.

在10204下,执行如下查询,并查看执行计划:

SQL> set autot traceonly explain
SQL> select count(*) from audience
  2  where month_no in (3, 25)
  3  ;

Execution Plan
----------------------------------------------------------
Plan hash value: 3337892515

---------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost  |
---------------------------------------------------------------
|   0 | SELECT STATEMENT   |          |     1 |     3 |     2 |
|   1 |  SORT AGGREGATE    |          |     1 |     3 |       |
|*  2 |   TABLE ACCESS FULL| AUDIENCE |   100 |   300 |     2 |
---------------------------------------------------------------

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

   2 - filter("MONTH_NO"=3 OR "MONTH_NO"=25)

Note
-----
   - cpu costing is off (consider enabling it)

在9204下,执行同样的查询:

SQL> explain plan for select count(*) from audience
  2  where month_no in (3, 25)
  3  ;

Explained.

SQL> @?/rdbms/admin/utlxpls.sql

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |     3 |     2 |
|   1 |  SORT AGGREGATE      |             |     1 |     3 |       |
|*  2 |   TABLE ACCESS FULL  | AUDIENCE    |   200 |   600 |     2 |
--------------------------------------------------------------------

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

   2 - filter("AUDIENCE"."MONTH_NO"=3 OR "AUDIENCE"."MONTH_NO"=25)

Note: cpu costing is off

15 rows selected.

二者的差别在于Cardinality,在9204下,优化器错误的把25的Cardinality也估计了进去,而没有考虑到month_no的取值范围。而在10204中,显然优化器在这方面已经做了改进,
在估计Cardinality的值时,省略了取值范围之外的值。

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

请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    325
  • 访问量
    1236119