【问题标题】:Is there a way to rebuild every index in every schema through stored procedure / plsql?有没有办法通过存储过程/plsql重建每个模式中的每个索引?
【发布时间】:2021-03-22 01:45:14
【问题描述】:

似乎无法想象一个存储过程可以在线重建数据库中每个模式中的每个索引。我只是想不通。

create or replace procedure rebuild_indexes(
    p_owner in varchar2,
    p_table_name in varchar2
) as
begin
    for indexes_to_rebuild in
    (
        select index_name
        from all_indexes
        where owner = p_owner
        and table_name = p_table_name
    ) loop
        execute immediate 'alter index '||p_owner||'.'
            ||indexes_to_rebuild.index_name||' rebuild online';
    end loop;
end;
/

【问题讨论】:

  • 鉴于重建索引从长远来看通常除了烧焦之外一无所获,您编写此过程的想法是什么?
  • @APC 频繁更改数据库中的表需要重建索引,这是帮助调整性能的例行程序。而且日常工作通常会自动化。
  • 该过程很好,但是它不会捕获分区索引,即它会在它们上失败。
  • 定期重建模式中的所有索引不会“调整性能”。分区维护后分区索引存在一个特定问题,但正如 Wernfried 指出的那样,您的过程无论如何都不会处理分区索引。
  • "上面的过程只给了我一个编译错误信息。"什么信息?你的程序为我编译和运行。

标签: oracle stored-procedures indexing plsql


【解决方案1】:

您可以通过稍微修改参数并查询 ALL_INDEXES 来尝试这样的过程

DECLARE
    PROCEDURE rebuild_indexes (p_owner        IN VARCHAR2 DEFAULT NULL,
                               p_table_name   IN VARCHAR2 DEFAULT NULL)
    AS
    BEGIN
        FOR indexes_to_rebuild
            IN (SELECT owner, index_name
                  FROM all_indexes
                 WHERE owner = NVL (p_owner, owner) AND table_name = NVL (p_table_name, table_name))
        LOOP
            BEGIN
                EXECUTE IMMEDIATE   'alter index '
                                 || indexes_to_rebuild.owner
                                 || '.'
                                 || indexes_to_rebuild.index_name
                                 || ' rebuild online';
            EXCEPTION
                WHEN OTHERS
                THEN
                    DBMS_OUTPUT.put_line (
                           'Failed to rebuild index '
                        || indexes_to_rebuild.owner
                        || '.'
                        || indexes_to_rebuild.index_name
                        || ': '
                        || SQLERRM);
            END;
        END LOOP;
    END;
BEGIN
    --Rebuild all indexes on a table
    rebuild_indexes (p_owner => 'APEX_190200', p_table_name => 'WWV_FLOWS');
    --Rebuild all indexes in a schema
    rebuild_indexes (p_owner => 'APEX_190200', p_table_name => NULL);
    --Rebuild all indexes
    rebuild_indexes (p_owner => NULL, p_table_name => NULL);
END;
/

【讨论】:

  • 这似乎成功了,谢谢!!
猜你喜欢
  • 1970-01-01
  • 2021-05-07
  • 2019-12-25
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多