Oracle撤消分析表

时间:2017-05-24 11:48:01

标签: sql oracle

我正在做索引和优化查询的任务,并且在分析我的表时匆匆一点。 在执行此命令之前,我想获得一些状态和成本的数据:

analyze table TAB1 compute statistics;

有没有办法“分析”一张桌子?

如果有帮助:我正在使用oracle 11.2G和SQL * Developer 4.1

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 |
--------------------------------------------------------------------------