我正在做索引和优化查询的任务,并且在分析我的表时匆匆一点。 在执行此命令之前,我想获得一些状态和成本的数据:
analyze table TAB1 compute statistics;
有没有办法“分析”一张桌子?
如果有帮助:我正在使用oracle 11.2G和SQL * Developer 4.1
答案 0 :(得分:1)
DBMS_STATS
包允许您保存并重新应用旧统计信息。
创建一个包含100K行的简单表。
--drop table tab1;
create table tab1(a number);
insert into tab1 select level from dual connect by level <= 100000;
begin
dbms_stats.gather_table_stats(user, 'TAB1');
end;
/
请注意,估算的行数在Rows
列中设置为100K。
explain plan for select * from tab1;
select * from table(dbms_xplan.display);
Plan hash value: 2211052296
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 100K| 488K| 69 (2)| 00:00:01 |
| 1 | TABLE ACCESS FULL| TAB1 | 100K| 488K| 69 (2)| 00:00:01 |
--------------------------------------------------------------------------
begin
dbms_stats.create_stat_table(user, 'TAB1_OLD_STATS');
dbms_stats.export_table_stats(user, 'TAB1', stattab => 'TAB1_OLD_STATS');
end;
/
更改统计信息后Rows
设置为99M。
begin
dbms_stats.set_table_stats(user, 'TAB1', numrows => 99999999);
end;
/
explain plan for select * from tab1;
select * from table(dbms_xplan.display);
Plan hash value: 2211052296
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 99M| 476M| 793 (92)| 00:00:01 |
| 1 | TABLE ACCESS FULL| TAB1 | 99M| 476M| 793 (92)| 00:00:01 |
--------------------------------------------------------------------------
使用DBMS_STATS.IMPORT_TABLE_STATS
统计信息将恢复为旧值,Rows
将恢复为100K。
begin
dbms_stats.import_table_stats(user, 'TAB1', stattab => 'TAB1_OLD_STATS');
end;
/
explain plan for select * from tab1;
select * from table(dbms_xplan.display);
Plan hash value: 2211052296
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 100K| 488K| 69 (2)| 00:00:01 |
| 1 | TABLE ACCESS FULL| TAB1 | 100K| 488K| 69 (2)| 00:00:01 |
--------------------------------------------------------------------------