组合分区表创建索引之后最好收集索引的统计信息
2015-01-17 21:21
357 查看
本实验基于Oracle10g
先建立一个组合分区表
create table t_sub(id number, data varchar2(20))
partition by range(id)subpartition by hash(data)
(partition p1 values less than (100)
(subpartition p1_s_1,
subpartition p1_s_2
),
partition p2 values less than (maxvalue)
(subpartition p2_s_1,
subpartition p2_s_2
)
);
插入数据
BEGIN
FOR i in 1..200 loop
insert into t_sub values(i,i||'A');
end loop;
END;
SQL> create index i_id on t_sub(id) local nologging;
Index created
SQL> select a.index_name,
2 decode(partitioned,'YES',b.partition_name,'NO')
3 partition,b.subpartition_name subpartition_name,b.num_rows,
4 b.distinct_keys,b.num_rows/b.distinct_keys
5 avg_row_per_key,b.distinct_keys/b.num_rows SELECTIVITY,
6 b.clustering_factor from dba_indexes
7 a,dba_ind_statistics b where a.owner=b.owner
8 and a.index_name=b.index_name and a.owner='&owner' and
9 a.index_name='&index_name';
INDEX_NAME PARTITION SUBPARTITI NUM_ROWS DISTINCT_KEYS AVG_ROW_PER_KEY SELECTIVITY CLUSTERING_FACTOR
---------- ---------- ---------- ---------- ------------- --------------- ----------- -----------------
I_ID P2 P2_S_2 58 58 1 1 1
I_ID P2 P2_S_1 43 43 1 1 1
I_ID P1 P1_S_2 44 44 1 1 1
I_ID P1 P1_S_1 55 55 1 1 1
I_ID P2 101 58
1.7413793103448 0.574257425 2
I_ID P1 99 55 1.8 0.555555555 2
I_ID 200 58 3.4482758620689 0.29 4
7 rows selected
我们都知道,创建索引的时候会自动收集统计信息,以前创建索引如果要收集统计信息还需要加上compute statistics,不过现在不需要了,已经默认会收集。从查询看出,子分区的统计信息 是准确的, 不过分区,以及全局的统计信息 是不准确 的。
注意看 distinct_keys。我插入的数据都没有重复的,不过Oracle却统计出有重复数据。
好了现在我收集统计信息
SQL> BEGIN
2 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'ROBINSON',
3 tabname => 'T_SUB',
4 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
5 method_opt => 'for all columns size repeat',
6 degree => DBMS_STATS.AUTO_DEGREE,
7 granularity => 'ALL',
8 cascade=>TRUE
9 );
10 END;
11 /
PL/SQL procedure successfully completed
再次查询 统计信息
SQL> select a.index_name,
2 decode(partitioned,'YES',b.partition_name,'NO')
3 partition,b.subpartition_name subpartition_name,b.num_rows,
4 b.distinct_keys,b.num_rows/b.distinct_keys
5 avg_row_per_key,b.distinct_keys/b.num_rows SELECTIVITY,
6 b.clustering_factor from dba_indexes
7 a,dba_ind_statistics b where a.owner=b.owner
8 and a.index_name=b.index_name and a.owner='&owner' and
9 a.index_name='&index_name';
INDEX_NAME PARTITION SUBPARTITI NUM_ROWS DISTINCT_KEYS AVG_ROW_PER_KEY SELECTIVITY CLUSTERING_FACTOR
---------- ---------- ---------- ---------- ------------- --------------- ----------- -----------------
I_ID P2 P2_S_2 58 58 1 1 1
I_ID P2 P2_S_1 43 43 1 1 1
I_ID P1 P1_S_2 44 44 1 1 1
I_ID P1 P1_S_1 55 55 1 1 1
I_ID P2 101 101 1 1 2
I_ID P1 99 99 1 1 2
I_ID 200 200 1 1 4
7 rows selected
现在准确了。
先建立一个组合分区表
create table t_sub(id number, data varchar2(20))
partition by range(id)subpartition by hash(data)
(partition p1 values less than (100)
(subpartition p1_s_1,
subpartition p1_s_2
),
partition p2 values less than (maxvalue)
(subpartition p2_s_1,
subpartition p2_s_2
)
);
插入数据
BEGIN
FOR i in 1..200 loop
insert into t_sub values(i,i||'A');
end loop;
END;
SQL> create index i_id on t_sub(id) local nologging;
Index created
SQL> select a.index_name,
2 decode(partitioned,'YES',b.partition_name,'NO')
3 partition,b.subpartition_name subpartition_name,b.num_rows,
4 b.distinct_keys,b.num_rows/b.distinct_keys
5 avg_row_per_key,b.distinct_keys/b.num_rows SELECTIVITY,
6 b.clustering_factor from dba_indexes
7 a,dba_ind_statistics b where a.owner=b.owner
8 and a.index_name=b.index_name and a.owner='&owner' and
9 a.index_name='&index_name';
INDEX_NAME PARTITION SUBPARTITI NUM_ROWS DISTINCT_KEYS AVG_ROW_PER_KEY SELECTIVITY CLUSTERING_FACTOR
---------- ---------- ---------- ---------- ------------- --------------- ----------- -----------------
I_ID P2 P2_S_2 58 58 1 1 1
I_ID P2 P2_S_1 43 43 1 1 1
I_ID P1 P1_S_2 44 44 1 1 1
I_ID P1 P1_S_1 55 55 1 1 1
I_ID P2 101 58
1.7413793103448 0.574257425 2
I_ID P1 99 55 1.8 0.555555555 2
I_ID 200 58 3.4482758620689 0.29 4
7 rows selected
我们都知道,创建索引的时候会自动收集统计信息,以前创建索引如果要收集统计信息还需要加上compute statistics,不过现在不需要了,已经默认会收集。从查询看出,子分区的统计信息 是准确的, 不过分区,以及全局的统计信息 是不准确 的。
注意看 distinct_keys。我插入的数据都没有重复的,不过Oracle却统计出有重复数据。
好了现在我收集统计信息
SQL> BEGIN
2 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'ROBINSON',
3 tabname => 'T_SUB',
4 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
5 method_opt => 'for all columns size repeat',
6 degree => DBMS_STATS.AUTO_DEGREE,
7 granularity => 'ALL',
8 cascade=>TRUE
9 );
10 END;
11 /
PL/SQL procedure successfully completed
再次查询 统计信息
SQL> select a.index_name,
2 decode(partitioned,'YES',b.partition_name,'NO')
3 partition,b.subpartition_name subpartition_name,b.num_rows,
4 b.distinct_keys,b.num_rows/b.distinct_keys
5 avg_row_per_key,b.distinct_keys/b.num_rows SELECTIVITY,
6 b.clustering_factor from dba_indexes
7 a,dba_ind_statistics b where a.owner=b.owner
8 and a.index_name=b.index_name and a.owner='&owner' and
9 a.index_name='&index_name';
INDEX_NAME PARTITION SUBPARTITI NUM_ROWS DISTINCT_KEYS AVG_ROW_PER_KEY SELECTIVITY CLUSTERING_FACTOR
---------- ---------- ---------- ---------- ------------- --------------- ----------- -----------------
I_ID P2 P2_S_2 58 58 1 1 1
I_ID P2 P2_S_1 43 43 1 1 1
I_ID P1 P1_S_2 44 44 1 1 1
I_ID P1 P1_S_1 55 55 1 1 1
I_ID P2 101 101 1 1 2
I_ID P1 99 99 1 1 2
I_ID 200 200 1 1 4
7 rows selected
现在准确了。
相关文章推荐
- 创建或重建索引时强制收集统计信息
- 深入学习分区表及分区索引(5)--创建range-hash组合分区(续)
- 收集统计信息导致索引被监控
- 深入学习分区表及分区索引(6)--创建range-list组合分区
- ETL系列:一种针对oracle分区表的统计信息收集策略
- 统计信息自动收集时间窗口导致分区表执行计划错误
- SQL调优之收集统计信息,重建索引 .
- 10G之后统计信息收集后为什么执行计划不会被立马淘汰
- 收集对象统计信息【表、列、索引】
- 创建分区索引时统计信息的准确性问题
- 由在EBS中收集分区表统计信息引发的思考
- Oracle重建表索引及手工收集统计信息
- Sybase数据库收集表及其索引的统计信息
- oracle表不走索引,收集一下表的统计信息
- Oracle收集索引统计信息
- Oracle收集统计信息和重建索引
- 分区表及分区索引(6)--创建range-list组合分区
- 深入学习分区表及分区索引(5)--创建range-hash组合分区
- 分区表imdp 导入 收集统计信息 自动 采样导致执行计划card 不准
- 创建分区索引时统计信息的准确性问题