Oracle вручную обновляет статистику по всем таблицам

Есть ли способ обновить всю статистику для всех таблиц независимо от владельца?

Я нашел эту sniplet, но я не уверен, что это захватит все таблицы....

BEGIN
   FOR A IN ( SELECT owner FROM SYS.all_tables ) LOOP
      execute immediate
        EXEC dbms_stats.gather_schema_stats( 'A.owner', cascade='TRUE');
   END LOOP;
END;

Ответ 2

Нет DBMS_STATS пакет может выполнять не более одной схемы за раз.

Вы можете использовать script ниже для сбора статистики для всех типов объектов во всех схемах. В списке, который вы указали, есть несколько проблем (необязательно выполнить немедленный, "A.owner" - это строка, но это должен быть объект и т.д.).

Вы можете добавить дополнительные схемы, чтобы пропустить в списке IN, поскольку вы, вероятно, не хотите делать это для встроенных схем (они в основном статичны, так что это будет пустой тратой). Кроме того, вам понадобятся соответствующие привилегии для каждой схемы, на которую вы собираете статистику (или регистрируетесь как администратор базы данных).

Соберите статистику по всем объектам (возможно, что вы действительно хотите):

BEGIN
    FOR rec IN (SELECT * 
                FROM all_users
                WHERE username NOT IN ('SYS','SYSDBA'))
    LOOP
        dbms_stats.gather_schema_stats(rec.username);
    END LOOP;
END;

Соберите статистику только по таблицам:

BEGIN
    FOR rec IN (SELECT * 
                FROM all_tables
                WHERE owner NOT IN ('SYS','SYSDBA'))
    LOOP
        dbms_stats.gather_table_stats(rec.owner, rec.table_name);
    END LOOP;
END;