5

我想创建一个检索表上所有索引并重建的过程

我用这个查询检索所有索引:

select index_name from user_indexes where table_name='your_table_name'

我用这个查询重建:

alter index <index_name> rebuild;

谢谢。

4

1 回答 1

6
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';
    end loop;
end;
/

尽管这只适用于最简单的索引。重建有很多限制。例如,如果索引是分区的,您需要重建每个分区或子分区。

您可能需要考虑许多选项。例如,ONLINE如果您希望其他人在重建期间使用索引,请添加一个PARALLEL选项以更快地重建(但这也会更改索引的并行设置,这可能会导致问题)等。

请记住,许多顶级 Oracle 专家认为重建索引通常是浪费时间。在极少数情况下,重建可以帮助索引,例如稀疏删除单调递增的值。但是大多数索引重建都是因为可以通过阅读 Richard Foote 的演讲Index Internals - Rebuilding the Truth来消除的神话。

重建将使您的索引最初运行得更快并且看起来更小,但这是因为缓存和减少了段空间分配等开销。一周后,您的索引可能会回到它们开始的位置。

于 2012-07-04T18:48:53.507 回答