首页 > Linux操作系统 > Linux操作系统 > 10g在cbo上的一个改进
表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博客 ” ,链接:https://blog.itpub.net/10972173/viewspace-594789/ ,如需转载,请注明出处,否则将追究法律责任。