如何将USER_TABLES与USER_OBJECTS中的相应索引连接起来?

时间:2018-04-23 11:08:28

标签: oracle indexing rebuild user-object

我有for循环来重建已更改主键的某些表的索引。无论如何,只从USER_OBJECTSTABLE_NAME链接USER_TABLES来选择这些表的索引,也排除任何IOT表的索引。

 FOR r IN (SELECT OBJECT_NAME AS OBJ FORM USER_OBJECTS WHERE OBJECT_TYPE = 'INDEX') LOOP
        l_sql := 'ALTER INDEX '||r.obj||' REBUILD'||'';
        EXECUTE IMMEDIATE l_sql;
 END LOOP; 

上面的代码只是简单地重建架构中的所有索引(包括IOT,因此命中错误ORA-28650: Primary index on an IOT cannot be rebuilt

2 个答案:

答案 0 :(得分:4)

我根本不会使用user_objects;为什么不从user_indexes开始,并将其加入user_tables

select ui.index_name from user_indexes ui
join user_tables ut on ut.table_name = ui.table_name
where ut.iot_type is null

所以你的循环变成了:

FOR r IN (
    select ui.index_name from user_indexes ui
    join user_tables ut on ut.table_name = ui.table_name
    where ut.iot_type is null
)
LOOP
    l_sql := 'ALTER INDEX "'||r.index_name||'" REBUILD';
    EXECUTE IMMEDIATE l_sql;
END LOOP; 

您真的不需要l_sql,但它可能对调试有用。

当然,您需要先质疑为什么要重建所有索引...

答案 1 :(得分:1)

select * from user_tables where iot_type is not null;

将返回索引组织表。

正如我所说,在使用索引时,请考虑查询USER_INDEXES