Friday, 7 October 2016

Stat gather locked objects

Stale stat gather does not gather stats on locked objects:

12:33:06 SQL> exec dbms_stats.lock_table_stats(null, 'XEMP1');
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.04

12:33:18 SQL> select owner,'.',table_name,LAST_ANALYZED,GLOBAL_STATS,USER_STATS,STATTYPE_LOCKED,STALE_STATS from dba_tab_statistics where table_name='XEMP1';
OWNER                          '.'                              TABLE_NAME                     LAST_ANAL GLO USE STATT STA
------------------------------ -------------------------------- ------------------------------ --------- --- --- ----- ---
SCOTT                          .                                XEMP1                                    NO  NO  ALL
Elapsed: 00:00:00.01

12:33:29 SQL> exec dbms_stats.gather_schema_stats ('&OWNER', cascade=>TRUE,FORCE=>TRUE,Degree=>16,estimate_percent=>5,options=>'GATHER STALE');
Enter value for owner: SCOTT
PL/SQL procedure successfully completed.
Elapsed: 00:00:04.81

12:33:58 SQL> select owner,'.',table_name,LAST_ANALYZED,GLOBAL_STATS,USER_STATS,STATTYPE_LOCKED,STALE_STATS from dba_tab_statistics where table_name='XEMP1';
OWNER                          '.'                              TABLE_NAME                     LAST_ANAL GLO USE STATT STA
------------------------------ -------------------------------- ------------------------------ --------- --- --- ----- ---
SCOTT                          .                                XEMP1                                    NO  NO  ALL

Stale stat gather does not gather stats on locked objects unless explicitly gathered with force=true:

12:34:07 SQL> EXEC dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'XEMP1',estimate_percent=>5, degree=>16,cascade => TRUE) ;
BEGIN dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'XEMP1',estimate_percent=>5, degree=>16,cascade => TRUE) ; END;
*
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 24281
ORA-06512: at "SYS.DBMS_STATS", line 24332
ORA-06512: at line 1
Elapsed: 00:00:00.02

12:38:30 SQL> EXEC dbms_stats.gather_table_stats(ownname=>'&OWNER',tabname=>'&TABLE',estimate_percent=>5, degree=>16,cascade => TRUE, FORCE => TRUE) ;
Enter value for owner: SCOTT
Enter value for table: XEMP1
PL/SQL procedure successfully completed.
Elapsed: 00:00:02.39

12:40:13 SQL> select owner,'.',table_name,LAST_ANALYZED,GLOBAL_STATS,USER_STATS,STATTYPE_LOCKED,STALE_STATS from dba_tab_statistics where table_name='XEMP1';
OWNER                          '.'                              TABLE_NAME                     LAST_ANAL GLO USE STATT STA
------------------------------ -------------------------------- ------------------------------ --------- --- --- ----- ---
SCOTT                          .                                XEMP1                          07-OCT-16 YES NO  ALL   NO
Elapsed: 00:00:00.15

12:40:22 SQL> select num_rows from dba_tables where table_name='XEMP1';
  NUM_ROWS
----------
   7418660