禁用并稍后启用 Oracle 中的所有表索引

发布于 2024-07-06 05:57:17 字数 71 浏览 7 评论 0原文

如何禁用并稍后启用 Oracle 中给定架构/数据库中的所有索引?

注意:这是为了让sqlldr运行得更快。

How would I disable and later enable all indexes in a given schema/database in Oracle?

Note: This is to make sqlldr run faster.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

旧人九事 2024-07-13 05:57:18

将 3 个答案合并在一起:
(因为 select 语句不执行 DDL)

set pagesize 0

alter session set skip_unusable_indexes = true;
spool c:\temp\disable_indexes.sql
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;
spool off
@c:\temp\disable_indexes.sql

执行导入...

select 'alter index ' || u.index_name || 
' rebuild online;' from user_indexes u;

注意,这假设导入将在同一个 (sqlplus) 会话中进行。
如果您调用“imp”,它将在单独的会话中运行,因此您需要使用“ALTER SYSTEM”而不是“ALTER SESSION”(并记住将参数放回您找到它的方式。

combining 3 answers together:
(because a select statement does not execute the DDL)

set pagesize 0

alter session set skip_unusable_indexes = true;
spool c:\temp\disable_indexes.sql
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;
spool off
@c:\temp\disable_indexes.sql

Do import...

select 'alter index ' || u.index_name || 
' rebuild online;' from user_indexes u;

Note this assumes that the import is going to happen in the same (sqlplus) session.
If you are calling "imp" it will run in a separate session so you would need to use "ALTER SYSTEM" instead of "ALTER SESSION" (and remember to put the parameter back the way you found it.

上课铃就是安魂曲 2024-07-13 05:57:18

从这里: http://forums.oracle.com/forums/thread.jspa? messageID=2354075

更改会话设置skip_unusable_indexes = true;

更改索引your_index不可用;

执行导入...

更改索引your_index重建[在线];< /代码>

From here: http://forums.oracle.com/forums/thread.jspa?messageID=2354075

alter session set skip_unusable_indexes = true;

alter index your_index unusable;

do import...

alter index your_index rebuild [online];

2024-07-13 05:57:18

您可以禁用 Oracle 中的约束,但不能禁用索引。 有一个命令可以使索引无法使用,但无论如何您都必须重建索引,因此我可能只编写一个脚本来删除并重建索引。 您可以使用 user_indexes 和 user_ind_columns 获取模式的所有索引或使用 dbms_metadata:

select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;

You can disable constraints in Oracle but not indexes. There's a command to make an index ununsable but you have to rebuild the index anyway, so I'd probably just write a script to drop and rebuild the indexes. You can use the user_indexes and user_ind_columns to get all the indexes for a schema or use dbms_metadata:

select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
帝王念 2024-07-13 05:57:18

如果您使用非并行直接路径加载,请考虑并进行基准测试,根本不删除索引,特别是当索引仅覆盖少数列时。 Oracle 有一种有效维护直接路径加载索引的机制。

否则,我还建议使索引不可用,而不是删除它们。 意外地不重新创建索引的可能性较小。

If you are using non-parallel direct path loads then consider and benchmark not dropping the indexes at all, particularly if the indexes only cover a minority of the columns. Oracle has a mechanism for efficient maintenance of indexes on direct path loads.

Otherwise, I'd also advise making the indexes unusable instead of dropping them. Less chance of accidentally not recreating an index.

迷雾森÷林ヴ 2024-07-13 05:57:18

如果您使用的是 Oracle 11g,您可能还需要查看 dbms_index_utl

If you're on Oracle 11g, you may also want to check out dbms_index_utl.

眼趣 2024-07-13 05:57:18

结合两个答案:

首先创建sql以使所有索引不可用:

alter session set skip_unusable_indexes = true;
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;

执行导入...

select 'alter index ' || u.index_name || ' rebuild online;' from user_indexes u;

Combining the two answers:

First create sql to make all index unusable:

alter session set skip_unusable_indexes = true;
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;

Do import...

select 'alter index ' || u.index_name || ' rebuild online;' from user_indexes u;
孤独患者 2024-07-13 05:57:18

您应该尝试 sqlldr 的 SKIP_INDEX_MAINTENANCE 参数。

You should try sqlldr's SKIP_INDEX_MAINTENANCE parameter.

笔芯 2024-07-13 05:57:17

如果没有文件,索引将无法使用:

DECLARE
  CURSOR  usr_idxs IS select * from user_indexes;
  cur_idx  usr_idxs% ROWTYPE;
  v_sql  VARCHAR2(1024);

BEGIN
  OPEN usr_idxs;
  LOOP
    FETCH usr_idxs INTO cur_idx;
    EXIT WHEN NOT usr_idxs%FOUND;

    v_sql:= 'ALTER INDEX ' || cur_idx.index_name || ' UNUSABLE';
    EXECUTE IMMEDIATE v_sql;
  END LOOP;
  CLOSE usr_idxs;
END;

重建将是类似的。

Here's making the indexes unusable without the file:

DECLARE
  CURSOR  usr_idxs IS select * from user_indexes;
  cur_idx  usr_idxs% ROWTYPE;
  v_sql  VARCHAR2(1024);

BEGIN
  OPEN usr_idxs;
  LOOP
    FETCH usr_idxs INTO cur_idx;
    EXIT WHEN NOT usr_idxs%FOUND;

    v_sql:= 'ALTER INDEX ' || cur_idx.index_name || ' UNUSABLE';
    EXECUTE IMMEDIATE v_sql;
  END LOOP;
  CLOSE usr_idxs;
END;

The rebuild would be similiar.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文