测试环境:WIN2003+ORA10g 10.2.0.1.0
| Partition | Analyze | TIME | Explain |
| no | no analyze | 11s | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 1291 |
| analyze table | 6s | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 1304 |
|
| analyze index | 13s | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 1356 |
|
| analyze table and index | 6s | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 1304 |
|
| 可以看到在没有分区情况下,对表进行信息统计后,查询效率有了明显的提高。但是如果只是单纯的分析索引,而没有对表进行分析,效果是非常不理想的。 Oracle针对表的分析更有用,而索引本身已经具备了相当的优化规则在里面,在下面的测试用也可以看到。 |
|||
| 把表分区 | no analyze | 8 | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 2796 |
| analyze table | 9 | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 1588 |
|
| analyze index | 8 | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 2796 |
|
| analyze table and index | 9 | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 1621 |
|
| 存在表分区的情况下,查询速度相应的提高。但是分析过表后,并没有表现出期望中的效率。 | |||
| 表和索引 分区 |
no analyze | 3 | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 2700 |
| analyze table | 3 | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 1607 |
|
| analyze table & index | 3 | Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=ALL_ROWS 1 1607 |
|
| 将表分区,同时建立了本地分区索引,效果的提升非常明显。Oracle自动使用合适的方法区优化查询效率, 很奇怪的是分析表与否并为产生比较大的影响,估计是测试方法有问题。或者是意外oracle10g的优化方式产生的结果 |
|||
在上面的基础上更改了查询语句,增加了使用制定Partition的参数:
SELECT COUNT (DISTINCT unitid)
FROM base_pass partition (P200706)t
WHERE t.testdate BETWEEN TO_DATE('2007-06-1', 'YYYY-MM-DD')
AND TO_DATE('2007-07-1', 'YYYY-MM-DD')
AND t.productfamily = 'V3M'
发现效果提升明显,只需要2s就可以完成查询
一些用到的脚步:
10g客户端无法到出9i数据
--到出数据
exp yyy/yyyyy@yyyy FILE="e:\exp\base_pass.DMP" LOG="d:\exp\exp_base_pass.log" TABLES=BASE_PASS buffer=4096000 feedback=10000
表空间名不同,重命名表空间
alter tablespace fcs rename to fcs_tables
--导入数据
imp xxxx/xxxx@xxx FILE="d:\exp\base_pass.DMP" LOG="d:\exp\exp_base_pass.log" TABLES=BASE_PASS fromuser=fcs touser=orphen buffer=2048000 commit=y ignore=y feedback=10000
----统计信息
--计算
begin
dbms_stats.gather_table_stats(ownname=> 'ORPHEN', tabname=> 'BASE_PASS', partname=> NULL);
end;
--估算统计信息
begin
dbms_stats.gather_table_stats(ownname=> 'ORPHEN', tabname=> 'BASE_PASS', partname=> NULL , estimate_percent=> 33 );
end;
--删除统计信息
begin
dbms_stats.delete_table_stats(ownname=> 'ORPHEN', tabname=> 'BASE_PASS');
end;
This work is licensed under a CC A-S 4.0 International License.