Oracle 如何在PL/SQL包中将会话变量skip_unusable_index设置为true以加速表的删除/插入?
我试图加速通过PL/SQL存储过程控制的数据加载。我已通过编程方式将要刷新的表的索引更改为不可用。我希望Oracle忽略这些不可用的索引。我可以发表声明:Oracle 如何在PL/SQL包中将会话变量skip_unusable_index设置为true以加速表的删除/插入?,oracle,session,plsql,indexing,Oracle,Session,Plsql,Indexing,我试图加速通过PL/SQL存储过程控制的数据加载。我已通过编程方式将要刷新的表的索引更改为不可用。我希望Oracle忽略这些不可用的索引。我可以发表声明: ALTER SESSION SET skip_unusable_indexes = TRUE 但我随后得到了一个错误: ORA-01502:索引“MY_index_NAME”或该索引的分区位于 不可用状态 所以它似乎忽略了我的改变 我可以在PL/SQL包中更改会话吗?如果没有,我的选择是什么? 我还可以如何禁用(设置为不可用)索引以加速加载
ALTER SESSION SET skip_unusable_indexes = TRUE
但我随后得到了一个错误:
ORA-01502:索引“MY_index_NAME”或该索引的分区位于
不可用状态
所以它似乎忽略了我的改变
我可以在PL/SQL包中更改会话吗?如果没有,我的选择是什么?
我还可以如何禁用(设置为不可用)索引以加速加载
一个有点相关的问题。您是否在存储过程使用的同一会话中发出ALTER SESSION语句?或者,ALTER会话是在单独的会话中执行的 您可以使用动态SQL在PL/SQL中嵌入ALTER会话,即
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET skip_unusable_indexes = TRUE';
<<more code>>
END;
最初尝试过,但它仍然给我ORA-01502错误。我认为这与此无关,ORA-01502错误是抱怨索引不可用(这是故意的),而不是违反了唯一约束。但这就是“此设置不会禁用唯一的不可用索引的错误报告”语句的要点. 看我刚才用演示做的编辑。好的,我明白你的意思。所以我尝试禁用唯一约束并再次运行,但ORA-01502仍然出现。我相信是的,但我已经继续。我对速度很满意,没有对索引进行任何额外的修改。谢谢你的建议。看来答案是。。。你不能。
SQL> create table a (
2 col1 number
3 );
Table created.
SQL> create unique index idx_a on a( col1 );
Index created.
SQL> insert into a values( 1 );
1 row created.
SQL> commit;
Commit complete.
SQL> alter index idx_a unusable;
Index altered.
SQL> insert into a values( 2 );
insert into a values( 2 )
*
ERROR at line 1:
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state
SQL> alter session set skip_unusable_indexes = true;
Session altered.
SQL> insert into a values( 2 );
insert into a values( 2 )
*
ERROR at line 1:
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state
SQL> drop index idx_a;
Index dropped.
SQL> create index idx_a_nonunique on a( col1 );
Index created.
SQL> alter index idx_a_nonunique unusable;
Index altered.
SQL> insert into a values( 2 );
1 row created.