Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Странное поведение dbms_stats на сегментированных индексах  [new]
FreeLancer
Guest
ORA 9.2.0.7 EE на Win
Наблюдаю странную ситуацию. Вот способ ее воспроизведения.
CREATE TABLE sales_composite (
salesman_id   NUMBER(5), 
salesman_name VARCHAR2(30), 
sales_amount  NUMBER(10), 
sales_date    DATE)
PARTITION BY RANGE(sales_date) 
SUBPARTITION BY HASH(salesman_id)
SUBPARTITION TEMPLATE(SUBPARTITION sp1,SUBPARTITION sp2,SUBPARTITION sp3,SUBPARTITION sp4)
(PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','DD/MM/YYYY')),
PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','DD/MM/YYYY')),
PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','DD/MM/YYYY')),
PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','DD/MM/YYYY')),
PARTITION sales_may2000 VALUES LESS THAN(TO_DATE('06/01/2000','DD/MM/YYYY')),
PARTITION sales_future VALUES LESS THAN(MAXVALUE));

CREATE INDEX I_SALES_NAME ON SALES_COMPOSITE(SALESMAN_NAME) TABLESPACE "INDX" LOCAL;
Пытаюсь собрать статистику по этому индексу по секциям, но оптом:
BEGIN
dbms_stats.delete_schema_stats(USER);
END;

BEGIN
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_JAN2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_FEB2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_MAR2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_APR2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_MAY2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_FUTURE', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False );
END;
Статистика собирается, вот только при этом в USER_INDEXES поле GLOBAL_STATS='YES' только для первой из перечисленных в предыдущем блоке кода секций. Однако если в каждый момент времени запускать сборку статистики только по одной секции, то такого эффекта нет (у всех признак глобальной статистики 'YES'). COMMIT положение не спасает. Проблема проявляется нестабильно (мучаюсь уже третий день). Вчера, например, появлялась регулярно, сегодня - редко.
Запросы абсолютно одинаковые.

В чем может быть причина, и как лечить?
6 фев 07, 13:39    [3744648]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение dbms_stats на сегментированных индексах  [new]
FreeLancer
Guest
Кажется, закономерность отыскалась.
Если по подсекциям предварительно не собирать статистику, то массовый сбор статистики по секциям проходит нормально, т.е. GLOBAL_STATS='YES'. Если же сделать что-то вроде
BEGIN
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_JAN2000_SP1', NULL, NULL, NULL, NULL, NULL, 'SUBPARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_JAN2000_SP2', NULL, NULL, NULL, NULL, NULL, 'SUBPARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_JAN2000_SP3', NULL, NULL, NULL, NULL, NULL, 'SUBPARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_JAN2000_SP4', NULL, NULL, NULL, NULL, NULL, 'SUBPARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_FEB2000_SP1', NULL, NULL, NULL, NULL, NULL, 'SUBPARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_FEB2000_SP2', NULL, NULL, NULL, NULL, NULL, 'SUBPARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_FEB2000_SP3', NULL, NULL, NULL, NULL, NULL, 'SUBPARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_FEB2000_SP4', NULL, NULL, NULL, NULL, NULL, 'SUBPARTITION', False ); 

  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_JAN2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_FEB2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_MAR2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_APR2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_MAY2000', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False ); 
  dbms_stats.gather_index_stats( USER, 'I_SALES_NAME', 'SALES_FUTURE', NULL, NULL, NULL, NULL, NULL, 'PARTITION', False );
END;
то сразу заметна разница в USER_IND_PARTITIONS (сорри, в первом посте ошибся именем вьюхи): для секций SALES_JAN2000 и SALES_FEB2000 будет GLOBAL_STATS='NO'.
Если же каждый из "сборов" выполнить индивидуально, а не массово, то GLOBAL_STATS='YES' для всех.
6 фев 07, 15:43    [3745586]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить