【问题标题】:How to set session variable skip_unusable_indexes to true in a PL/SQL package to speed up a table delete/insert?如何在 PL/SQL 包中将会话变量 skip_unusable_indexes 设置为 true 以加速表删除/插入?
【发布时间】:2010-09-16 07:45:47
【问题描述】:

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

ALTER SESSION SET skip_unusable_indexes = TRUE

但我随后得到了错误:

ORA-01502: 索引 'MY_INDEX_NAME' 或此类索引的分区位于 不可用状态

所以它似乎忽略了我的更改会话。

我可以在 PL/SQL 包中更改我的会话吗?如果没有,我的选择是什么? 我还能如何禁用(设置为不可用)索引以加快加载速度?

一个有点相关的问题here

【问题讨论】:

  • 似乎答案是......你不能。

标签: oracle session plsql indexing


【解决方案1】:

您是否在存储过程正在使用的同一会话中发出 ALTER SESSION 语句?还是在单独的会话中执行 ALTER SESSION?

您可以使用动态 SQL 将 ALTER SESSION 嵌入到您的 PL/SQL 中,即

BEGIN
  EXECUTE IMMEDIATE 'ALTER SESSION SET skip_unusable_indexes = TRUE';

  <<more code>>
END;

某些索引是否唯一(或用于强制执行唯一约束)?正如skip_unusable_indexes documentation 所述

注意:如果使用索引来强制执行 对表的 UNIQUE 约束,然后 允许插入和更新操作 在桌子上可能会违反 约束。因此,这个设置 不禁用错误报告 唯一的不可用索引。

如果是这种情况,您可以禁用约束和/或将索引更改为非唯一的吗?

唯一索引和非唯一索引之间差异的快速示例。请注意,当您有一个不可用的唯一索引时,skip_unusable_indexes 不会像当您有一个不可用的非唯一索引时那样抑制 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.

【讨论】:

  • 最初尝试过,但它仍然给我 ORA-01502 错误。
  • 我不认为这是相关的,ORA-01502 错误是抱怨索引不可用(这是有意的)而不是违反了唯一约束。
  • 但这就是“此设置不会禁用唯一的不可用索引的错误报告”语句的重点。通过演示查看我刚刚所做的编辑。
  • 好的,我明白你的意思了。所以我尝试禁用唯一约束并再次运行,但 ORA-01502 仍然出现。
  • 我相信是这样,但我已经继续前进了。我对速度感到满意,无需对索引进行任何额外的更改。感谢您的所有建议。
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 2010-09-23
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
相关资源
最近更新 更多