生成执行计划
EXPLAIN PLAN
SET STATEMENT_ID = 'st1' FOR
.........................................................
SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY(null,'st1','basic'));
;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------
Plan hash value: 3156184124
--------------------------------------------------------
| Id | Operation | Name |
--------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT GROUP BY | |
| 2 | TABLE ACCESS BY INDEX ROWID| PS_OPEN_ITEM_GL |
| 3 | NESTED LOOPS | |
| 4 | TABLE ACCESS FULL | PS_GL_OI_TMP003 |
| 5 | INDEX RANGE SCAN | PSAOPEN_ITEM_GL |
--------------------------------------------------------
已选择12行。
检查当前的统计信息,发现是19日的。
alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
SELECT last_analyzed from user_tables where table_name='PS_OPEN_ITEM_GL';
LAST_ANALYZED
-------------------
19.05.2010 06:24:03
创建一个表备份19日的统计信息
EXEC DBMS_STATS.CREATE_STAT_TABLE(user, STATTAB=>'STAT_TABLE_19');
EXEC DBMS_STATS.EXPORT_TABLE_STATS(user, tabname=>'PS_OPEN_ITEM_GL', stattab=>'STAT_TABLE_19');
SQL> select dbms_stats.get_stats_history_availability from dual;
GET_STATS_HISTORY_AVAILABILITY
---------------------------------------------------------------------------
23-4月 -10 11.10.50.961842000 下午 +08:00
select TABLE_NAME, STATS_UPDATE_TIME from user_tab_stats_history where table_name='PS_OPEN_ITEM_GL';
SQL> select TABLE_NAME, STATS_UPDATE_TIME from user_tab_stats_history where tabl
e_name='PS_OPEN_ITEM_GL';
TABLE_NAME
------------------------------------------------------------
STATS_UPDATE_TIME
---------------------------------------------------------------------------
PS_OPEN_ITEM_GL
24-4月 -10 06.20.54.478324 上午 +08:00
PS_OPEN_ITEM_GL
25-4月 -10 06.21.10.914586 上午 +08:00
......后面略
恢复14日的统计信息
set nls_lang=american_america.zhs16gbk
execute dbms_stats.restore_table_stats (user,'PS_OPEN_ITEM_GL','14-MAY-10 11.00.00.000000 AM +08:00');
SELECT last_analyzed from user_tables where table_name='PS_OPEN_ITEM_GL';
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> SELECT last_analyzed from user_tables where table_name='PS_OPEN_ITEM_GL';
LAST_ANALYZED
-------------------
14.05.2010 06:22:47
查询统计信息中的记录条数和实际的记录条数
SQL> SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME='PS_OPEN_ITEM_GL';
NUM_ROWS
----------
1754105
SQL> SELECT COUNT(*) FROM PS_OPEN_ITEM_GL;
COUNT(*)
----------
1780199
EXPLAIN PLAN
SET STATEMENT_ID = 'st_19' FOR
...........................................
SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY(null,'st_19','basic'));
PLAN_TABLE_OUTPUT
------------------------------------------------------------------
--------------------
Plan hash value: 1864191602
--------------------------------------------------------
| Id | Operation | Name |
--------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT GROUP BY | |
| 2 | TABLE ACCESS BY INDEX ROWID| PS_OPEN_ITEM_GL |
| 3 | NESTED LOOPS | |
| 4 | TABLE ACCESS FULL | PS_GL_OI_TMP003 |
| 5 | INDEX RANGE SCAN | PSBOPEN_ITEM_GL |
--------------------------------------------------------
12 rows selected.
19日用的是PSAOPEN_ITEM_GL索引,14日用的是PSBOPEN_ITEM_GL 索引
备份一个14日的统计信息
EXEC DBMS_STATS.CREATE_STAT_TABLE(user, STATTAB=>'STAT_TABLE_14');
EXEC DBMS_STATS.EXPORT_TABLE_STATS(user, tabname=>'PS_OPEN_ITEM_GL', stattab=>'STAT_TABLE_14');
恢复19日的统计信息:
SQL> EXEC DBMS_STATS.IMPORT_TABLE_STATS(user, tabname=>'PS_OPEN_ITEM_GL', statta
b=>'STAT_TABLE_19');
PL/SQL procedure successfully completed.
SQL> SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME='PS_OPEN_ITEM_GL';
NUM_ROWS
----------
1771495
SQL> SELECT last_analyzed from user_tables where table_name='PS_OPEN_ITEM_GL';
LAST_ANALYZED
-------------------
19.05.2010 06:24:03
两个索引的定义如下:
SQL> select dbms_metadata.get_ddl('INDEX','PSAOPEN_ITEM_GL') FROM DUAL;
DBMS_METADATA.GET_DDL('INDEX',
--------------------------------------------------------------------------------
CREATE INDEX "SYSADM"."PSAOPEN_ITEM_GL" ON "SYSADM"."PS_OPEN_ITEM_GL" ("ACCOUN
T", "OPEN_ITEM_KEY")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 40960 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "PSINDEX2"
SQL> select dbms_metadata.get_ddl('INDEX','PSBOPEN_ITEM_GL') FROM DUAL;
DBMS_METADATA.GET_DDL('INDEX',
--------------------------------------------------------------------------------
CREATE INDEX "SYSADM"."PSBOPEN_ITEM_GL" ON "SYSADM"."PS_OPEN_ITEM_GL" ("OPEN_I
TEM_KEY", "DEPTID",
CCOUNT")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 40960 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "PSINDEX2"
解决方案:
可以在sql中增加一个hint指定使用PSBOPEN_ITEM_GL 索引
可以建一个outline指定用这个索引
将14日的统计信息锁定,以后不收集了。