Пятничная задача: не собираются гистограммы

Vladimir Sitnikov
Дата: 07.12.2007 12:31:50
Как такое может быть?
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
JServer Release 9.2.0.8.0 - Production

SQL> CREATE TABLE test (
  2    ID NUMBER(5)
  3  );
Table created.

SQL> INSERT INTO test VALUES(2);
1 row created.

SQL> COMMIT;
Commit complete.

SQL> exec dbms_stats.gather_table_stats(USER, 'TEST');
BEGIN dbms_stats.gather_table_stats(USER, 'TEST'); END;

*
ERROR at line 1:
ORA-20000: Cannot parse for clause: FOR ALL COLUMNS SIZE 20
ORA-06512: at "SYS.DBMS_STATS", line 10502
ORA-06512: at "SYS.DBMS_STATS", line 10516
ORA-06512: at line 1

SQL> exec dbms_stats.gather_table_stats(USER, 'TEST', method_opt=>'for columns id size 20');
BEGIN dbms_stats.gather_table_stats(USER, 'TEST', method_opt=>'for columns id size 20'); END;

*
ERROR at line 1:
ORA-20000: Cannot parse for clause: FOR COLUMNS ID SIZE 1
ORA-06512: at "SYS.DBMS_STATS", line 10502
ORA-06512: at "SYS.DBMS_STATS", line 10516
ORA-06512: at line 1

SQL> exec dbms_stats.gather_table_stats(USER, 'TEST', method_opt=>NULL);
PL/SQL procedure successfully completed.
Vladimir Sitnikov
Дата: 07.12.2007 12:33:24
сообщения об ошибках перепутались... но, суть та же -- при указании method_opt статистика не собирается:
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
JServer Release 9.2.0.8.0 - Production

SQL> CREATE TABLE test (
  2    ID NUMBER(5)
  3  );
Table created.

SQL> INSERT INTO test VALUES(2);
1 row created.

SQL> COMMIT;
Commit complete.

SQL> exec dbms_stats.gather_table_stats(USER, 'TEST');
BEGIN dbms_stats.gather_table_stats(USER, 'TEST'); END;

*
ERROR at line 1:
ORA-20000: Cannot parse for clause: FOR ALL COLUMNS SIZE 1
ORA-06512: at "SYS.DBMS_STATS", line 10502
ORA-06512: at "SYS.DBMS_STATS", line 10516
ORA-06512: at line 1

SQL> exec dbms_stats.gather_table_stats(USER, 'TEST', method_opt=>'for columns id size 20');
BEGIN dbms_stats.gather_table_stats(USER, 'TEST', method_opt=>'for columns id size 20'); END;

*
ERROR at line 1:
ORA-20000: Cannot parse for clause: FOR COLUMNS ID SIZE 20
ORA-06512: at "SYS.DBMS_STATS", line 10502
ORA-06512: at "SYS.DBMS_STATS", line 10516
ORA-06512: at line 1

SQL> exec dbms_stats.gather_table_stats(USER, 'TEST', method_opt=>NULL);
PL/SQL procedure successfully completed.
[/quot]
dmidek
Дата: 07.12.2007 13:06:10
Владимир, Вы в металинк уже заглядывали ?

Bug 3082227
не Ваш случай ? Переносов нет ? :-)
Vladimir Sitnikov
Дата: 07.12.2007 13:14:51
dmidek
не Ваш случай ? Переносов нет ? :-)

Случай не мой. Переносов нет. Все буквы нормальные (т.е. только пробелы и латинские).

Ошибка появляется даже тогда, когда параметр method_opt принимает своё значение по-умолчанию. Раньше гистограмы хорошо собирались. Пакеты (вообще ни один пакет в базе) никто не трогал.
Splain
Дата: 07.12.2007 14:06:42
Что говорит трассировка 10046 уровня 12?
Vladimir Sitnikov
Дата: 07.12.2007 15:18:16
Splain
Что говорит трассировка 10046 уровня 12?


*** 2007-12-07 15:14:36.831
*** SESSION ID:(43.2786) 2007-12-07 15:14:36.831
APPNAME mod='SQL*Plus' mh=3669949024 act='' ah=4029777240
=====================
PARSING IN CURSOR #2 len=69 dep=0 uid=54 oct=42 lid=54 tim=1168974293780369 hv=1494869006 ad='91620988'
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'
END OF STMT
EXEC #2:c=0,e=9766,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=1168974293780369
WAIT #2: nam='SQL*Net message to client' ela= 0 p1=1413697536 p2=1 p3=0
WAIT #2: nam='SQL*Net message from client' ela= 9375000 p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #2 len=57 dep=0 uid=54 oct=47 lid=54 tim=1168974303155369 hv=4184178294 ad='91ebd620'
BEGIN dbms_stats.gather_table_stats(USER, 'TEST'); END;
END OF STMT
PARSE #2:c=10000,e=0,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=1168974303155369
BINDS #2:
BINDS #3:
=====================
PARSING IN CURSOR #3 len=25 dep=1 uid=54 oct=3 lid=545460846646 tim=1168974303165134 hv=2403185938 ad='8c772268'
SELECT USER FROM SYS.DUAL
END OF STMT
EXEC #3:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=1168974303165134
FETCH #3:c=0,e=0,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=4,tim=1168974303165134
XCTEND rlbk=0, rd_only=1
BINDS #4:
 bind 0: dty=1 mxl=32(04) mal=00 scl=00 pre=00 oacflg=03 oacfl2=1 size=64 offset=0
   bfp=2a969dfee8 bln=32 avl=04 flg=05
   value="TEST"
 bind 1: dty=1 mxl=32(07) mal=00 scl=00 pre=00 oacflg=03 oacfl2=1 size=0 offset=32
   bfp=2a969dff08 bln=32 avl=07 flg=01
   value="TEST_XA"
=====================
PARSING IN CURSOR #4 len=193 dep=1 uid=0 oct=3 lid=180388626432 tim=1168974303165134 hv=1364267412 ad='8c6513c8'
SELECT /*+ rule */ DECODE(BITAND(T.PROPERTY,2147483648), 0, 0, 1) FROM SYS.OBJ$ TOB, SYS.USER$ U, SYS.TAB$ T WHERE TOB.NAME = :B2 AND U.NAME = :B1 AND TOB.OBJ# = T.OBJ# AND TOB.OWNER# = U.USER#
END OF STMT
EXEC #4:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=3,tim=1168974303165134
FETCH #4:c=0,e=0,p=0,cr=8,cu=0,mis=0,r=1,dep=1,og=3,tim=1168974303165134
BINDS #5:
 bind 0: dty=1 mxl=32(07) mal=00 scl=00 pre=00 oacflg=13 oacfl2=1 size=64 offset=0
   bfp=2a96a215b0 bln=32 avl=07 flg=05
   value="TEST_XA"
 bind 1: dty=1 mxl=32(04) mal=00 scl=00 pre=00 oacflg=13 oacfl2=1 size=0 offset=32
   bfp=2a96a215d0 bln=32 avl=04 flg=01
   value="TEST"
=====================
PARSING IN CURSOR #5 len=209 dep=1 uid=0 oct=3 lid=180388626432 tim=1168974303165134 hv=3876164154 ad='8c688098'
SELECT /*+ rule */ '"'||OI.NAME||'"' FROM SYS.USER$ U, SYS.OBJ$ OT, SYS.IND$ I, SYS.OBJ$ OI WHERE U.NAME = :B2 AND OT.OWNER# = U.USER# AND OT.NAME = :B1 AND I.BO# = OT.OBJ# AND I.TYPE# = 4 AND I.OBJ# = OI.OBJ#
END OF STMT
EXEC #5:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=3,tim=1168974303165134
FETCH #5:c=0,e=0,p=0,cr=8,cu=0,mis=0,r=0,dep=1,og=3,tim=1168974303165134
BINDS #6:
 bind 0: dty=1 mxl=32(01) mal=00 scl=00 pre=00 oacflg=03 oacfl2=1 size=32 offset=0
   bfp=2a969dff08 bln=32 avl=01 flg=05
   value="1"
=====================
PARSING IN CURSOR #6 len=33 dep=1 uid=54 oct=3 lid=54 tim=1168974303165134 hv=1539459602 ad='8dc7ea48'
SELECT TO_NUMBER(:b1)   FROM DUAL
END OF STMT
EXEC #6:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=1168974303165134
FETCH #6:c=0,e=0,p=0,cr=5,cu=0,mis=0,r=1,dep=1,og=4,tim=1168974303165134
EXEC #2:c=0,e=9765,p=0,cr=24,cu=0,mis=0,r=0,dep=0,og=4,tim=1168974303165134
ERROR #2:err=20000 tim=3738851652
WAIT #2: nam='SQL*Net break/reset to client' ela= 0 p1=1413697536 p2=1 p3=0
WAIT #2: nam='SQL*Net break/reset to client' ela= 39063 p1=1413697536 p2=0 p3=0
WAIT #2: nam='SQL*Net message to client' ela= 0 p1=1413697536 p2=1 p3=0
WAIT #2: nam='SQL*Net message from client' ela= 5859375 p1=1413697536 p2=1 p3=0
XCTEND rlbk=0, rd_only=1
Тынц.
Дата: 08.12.2007 02:16:17
select * from sys.optstat_hist_control$ ?
Тынц.
Дата: 08.12.2007 02:26:54
Или лучше покажите select count(*) from dual :)
Vladimir Sitnikov
Дата: 08.12.2007 12:31:43
Тынц.
Или лучше покажите select count(*) from dual :)
:)

SQL> SELECT COUNT(*) FROM dual;

  COUNT(*)
----------
      2048

SQL> DROP TABLE dual;

Table dropped.

SQL> exec dbms_stats.gather_table_stats(USER, 'test');

PL/SQL procedure successfully completed.
Splain
Дата: 10.12.2007 12:56:11
Vladimir Sitnikov


SQL> SELECT COUNT(*) FROM dual;

  COUNT(*)
----------
      2048



Мда. Известный баян.

Oracle тоже молодцы. Скрыть реальную причину exception за ORA-20000: Cannot parse for clause: %S

:)