テーブルのすべてのインデックスを取得して再構築するプロシージャを作成したい
このクエリですべてのインデックスを取得します。
select index_name from user_indexes where table_name='your_table_name'
そして私はこのクエリで再構築しました:
alter index <index_name> rebuild;
どうも。
テーブルのすべてのインデックスを取得して再構築するプロシージャを作成したい
このクエリですべてのインデックスを取得します。
select index_name from user_indexes where table_name='your_table_name'
そして私はこのクエリで再構築しました:
alter index <index_name> rebuild;
どうも。
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を読むことで払拭できる神話のために行われます。
再構築すると、インデックスの最初の実行速度が速くなり、小さく見えますが、これはキャッシングと、セグメント スペースの割り当てなどのオーバーヘッドの削減によるものです。1 週間後、インデックスはおそらく元の状態に戻っているでしょう。