stored-procedures - 创建一个过程来检索我的表上的所有索引并重建

标签 stored-procedures oracle10g indexing 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;
/
虽然这只适用于最简单的索引。有很多restrictions在重建。例如,如果索引已分区,则需要重建每个分区或子分区。
您可能需要考虑许多选项。例如,使用 ONLINE如果您希望其他人在重建期间使用该索引,请添加 PARALLEL选项以更快地重建(但这也会更改索引的并行设置,这可能会导致问题)等。
请记住,许多顶级 Oracle 专家认为重建索引通常是在浪费时间。在一些罕见的情况下,重建可以帮助索引,例如对单调增加的值进行稀疏删除。但是大多数索引重建是因为神话可以通过阅读 Richard Foote 的演示文稿来消除Index Internals - Rebuilding the Truth .
重建将使您的索引最初运行得更快并且看起来更小,但这是因为缓存和减少了诸如段空间分配之类的开销。一周后,您的索引可能会回到它们开始的位置。

关于stored-procedures - 创建一个过程来检索我的表上的所有索引并重建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11332076/

相关文章:

sql - 带 IF 条件的 PL/SQL 游标

MySQL 存储过程 - IF EXISTS ... THEN 返回意外结果

sql - 从函数返回记录集(虚拟表)

java - 从 OracleJDBC 调用存储过程出现异常

sql - Oracle PL/SQL 引用游标如何

oracle - 在匿名 block 内显示选择结果

python - 如何填充 Pandas 索引 NaN 的

mysql - 为什么MySql不自动优化BETWEEN查询?

c# - TransactionScope - 基础提供程序在 EnlistTransaction 上失败。 MSDTC 被中止

sql - 可以使用 AUTO_INCRMENT id 列代替 DATETIME 列来进行 SQL 排序吗?