Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何在PL/SQL包中将会话变量skip_unusable_index设置为true以加速表的删除/插入?_Oracle_Session_Plsql_Indexing - Fatal编程技术网

Oracle 如何在PL/SQL包中将会话变量skip_unusable_index设置为true以加速表的删除/插入?

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包中更改会话吗?如果没有,我的选择是什么? 我还可以如何禁用(设置为不可用)索引以加速加载

我试图加速通过PL/SQL存储过程控制的数据加载。我已通过编程方式将要刷新的表的索引更改为不可用。我希望Oracle忽略这些不可用的索引。我可以发表声明:

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.