ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle实验记录 (分区表,扫描基数的计算)

oracle实验记录 (分区表,扫描基数的计算)

原创 Linux操作系统 作者:fufuh2o 时间:2009-07-08 11:59:14 0 删除 编辑

关于分区 card
今天pub上搜索分区 ,无意中发现一个帖子
http://www.itpub.net/thread-1006757-1-1.html  08年的

问
有2种查询方式
select * from t partition(p1);
select * from t where t.parttition_cd=1
 以上查询都在一个分区中,cost一样但card不一样 是为什么

原因是card的计算问题
特此实验并记录
create table t1 太长不贴全了 (表是根据 基于成本优化书中的一个脚本,表比较大方便分析分区)
   partition       p0200 values less than ( 200),
   partition       p0400 values less than ( 400),
   partition       p0600 values less than ( 600),
   partition       p0800 values less than ( 800),        重点分区信息
   partition       p1000 values less than (1000)
)

SQL> execute dbms_stats.gather_table_stats('SYS','T1');~收集下信息

PL/SQL procedure successfully completed.
 
查看一些T1的基本信息
SQL> select table_name,num_rows from user_tables where table_name='T1';

TABLE_NAME                       NUM_ROWS
------------------------------ ----------
T1                                1003670

SQL> select column_name ,num_distinct,density ,num_nulls from user_tab_col_sta
stics where table_name='T1';

COLUMN_NAME                    NUM_DISTINCT    DENSITY  NUM_NULLS
------------------------------ ------------ ---------- ----------
PART_COL                                911 .001097695          0
ID                                  1003670 9.9634E-07          0
SMALL_VC                            1003670 9.9634E-07          0
PADDING                                   1          1          0
SQL> selEct partition_name,num_rows from user_tab_partitions where table_name='T
1';

PARTITION_NAME                   NUM_ROWS
------------------------------ ----------
P0200                               40000*******************
P0400                              119071
P0600                              200286
P0800                              279693
P1000                              360246

SQL> select PARTITION_NAME,COLUMN_NAME,NUM_DISTINCT,DENSITY,NUM_NULLS from  USER
_PART_COL_STATISTICS where table_name='T1';

PARTIT COLUMN_N NUM_DISTINCT    DENSITY  NUM_NULLS
------ -------- ------------ ---------- ----------
P0200  PART_COL          200       .005          0***********************
P0200  ID              40000    .000025          0
P0200  SMALL_VC        40000    .000025          0
P0200  PADDING             1          1          0
P0400  PART_COL          201 .004975124          0
P0400  ID             119071 8.3984E-06          0
P0400  SMALL_VC       119071 8.3984E-06          0
P0400  PADDING             1          1          0
P0600  PART_COL          201 .004975124          0
P0600  ID             200286 4.9929E-06          0
P0600  SMALL_VC       200286 4.9929E-06          0

PARTIT COLUMN_N NUM_DISTINCT    DENSITY  NUM_NULLS
------ -------- ------------ ---------- ----------
P0600  PADDING             1          1          0
P0800  PART_COL          200       .005          0
P0800  ID             279693 3.5753E-06          0
P0800  SMALL_VC       279693 3.5753E-06          0
P0800  PADDING             1          1          0
P1000  PART_COL          200       .005          0
P1000  ID             360246 2.7759E-06          0
P1000  SMALL_VC       360246 2.7759E-06          0
P1000  PADDING             1          1          0

20 rows selected.

SQL> explain plan for select * from t1 partition(P0200);

Explained.

SQL> select * from table(dbms_xplan.display);

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

Plan hash value: 2602558080

-------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost  | Pstart| Pstop |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |      | 40000 |  2734K|    42 |       |       |
|   1 |  PARTITION RANGE SINGLE|      | 40000 |  2734K|    42 |     1 |     1 |
|   2 |   TABLE ACCESS FULL    | T1   | 40000 |  2734K|    42 |     1 |     1 |
-------------------------------------------------------------------------------

Note

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

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

13 rows selected.
没有过滤谓词  Pstart,Pstop 都为1,在一个分区中 rows=p0200分区的num_rows=40000

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> explain plan for select * from t1 where part_col=2;

Explained.

SQL> select * from table(dbms_xplan.display);

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

Plan hash value: 2602558080

-------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost  | Pstart| Pstop |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |      |   200 | 14000 |    42 |       |       |
|   1 |  PARTITION RANGE SINGLE|      |   200 | 14000 |    42 |     1 |     1 |
|*  2 |   TABLE ACCESS FULL    | T1   |   200 | 14000 |    42 |     1 |     1 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):

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

---------------------------------------------------

   2 - filter("PART_COL"=2)

过滤谓词 "PART_COL"=2  rows=该分区的num_rows*1/该分区的num_distinct(是该分区的)=40000*1/200
=200

实际情况 复杂的多得多,跨越分区的card计算 会在以后有空的时候 实验记录下

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

请登录后发表评论 登录
全部评论

注册时间:2009-06-26

  • 博文量
    182
  • 访问量
    471639