Как я могу написать запрос, который генерирует набор команд ANALYZE INDEX для каждого индекса, принадлежащего определенному пользователю? - PullRequest
2 голосов
/ 26 апреля 2011

Как видно из заголовка, в базе данных Oracle 10g я хотел бы создать запрос, который будет генерировать набор команд ANALYZE INDEX для каждого индекса, принадлежащего определенному пользователю.Я - полный дилетант, когда дело доходит до тем базы данных, поэтому, пожалуйста, держите ответы как можно более дурацкими, спасибо!

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Поскольку вы используете Oracle 10g, вам действительно следует вместо этого использовать DBMS_STATS.Это можно реализовать так же просто, как ...

begin
    for r in ( select index_name from user_indexes )
    loop
        dbms_stats.gather_index_stats(user, r.index_name);
    end loop;
end;

Есть и другие параметры: c проверить документацию .

Если вы хотите сгенерировать статистику для индексов других пользователей, используйте взамен ALL_INDEXES и ограничьте OWNER.


Если ваше сердце настроено на АНАЛИЗ, тогда

spool anl_idx.sql

select 'analyze index '||&&owner||'.'||index_name||' compute statistics;'
from all_indexes
where owner = '&&owner';

spool off
1 голос
/ 26 апреля 2011

Можно.Однако, если вы непрофессионал, когда речь идет о темах, связанных с базами данных, я бы очень обеспокоен тем, что вы делаете что-то, что создает для вас всевозможные проблемы.Поэтому я хотел бы спросить, какую проблему вы пытаетесь решить.

  • ANALYZE, как правило, устарел для ряда выпусков в пользу пакета DBMS_STATS.
  • Oracle 10g уже имеетпо умолчанию фоновое задание, которое регулярно собирает статистику по объектам, включая индексы.Если это было отключено, у ваших администраторов почти наверняка была бы своя собственная работа по сбору статистики, которой вы почти наверняка не захотите мешать.
  • Сбор статистики может изменить планы запросов, которые могут вызвать всевиды производительности, особенно если статистика индекса не соответствует статистике таблицы.

Вы можете сделать что-то вроде

DECLARE
  p_owner VARCHAR2(30) := 'BOB'; -- Replace BOB with the user name you are interested in
BEGIN
  FOR idx IN (SELECT * FROM dba_indexes WHERE owner = p_owner)
  LOOP
    EXECUTE IMMEDIATE 'ANALYZE INDEX ' || p_owner || '.' || idx.index_name ||
                      ' COMPUTE STATISTICS';
  END LOOP;
END;

, но я бы очень хотел понять, где вы 'придет раньше, чем я предположу, что вы действительно запустите это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...