首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在PL/SQL过程中禁用索引

无法在PL/SQL过程中禁用索引
EN

Stack Overflow用户
提问于 2010-05-11 20:21:54
回答 2查看 8K关注 0票数 5

我已经编写了一个PL/SQL过程,如果索引首先被禁用,然后在完成后重新构建,它将受益。现有线程建议采用这种方法:

代码语言:javascript
运行
复制
alter session set skip_unusable_indexes = true;

alter index your_index unusable;

做进口

代码语言:javascript
运行
复制
alter index your_index rebuild;

但是,我在第一个alter index语句上得到了以下错误:

代码语言:javascript
运行
复制
SQL Error: ORA-14048: a partition maintenance operation may not be combined with other operations
ORA-06512: [...]
14048. 00000 -  "a partition maintenance operation may not be combined with other operations"
*Cause:    ALTER TABLE or ALTER INDEX statement attempted to combine
           a partition maintenance operation (e.g. MOVE PARTITION) with some
           other operation (e.g. ADD PARTITION or PCTFREE which is illegal
*Action:   Ensure that a partition maintenance operation is the sole
           operation specified in ALTER TABLE or ALTER INDEX statement;
           operations other than those dealing with partitions,
           default attributes of partitioned tables/indices or
           specifying that a table be renamed (ALTER TABLE RENAME) may be
           combined at will

问题索引的定义如下:

代码语言:javascript
运行
复制
CREATE INDEX A11_IX1 ON STREETS ("SHAPE")
  INDEXTYPE IS "SDE"."ST_SPATIAL_INDEX" PARAMETERS
  ('ST_GRIDS=890,8010,72090 ST_SRID=2');

这是来自第三方供应商的自定义索引类型,在大容量更新/插入/删除操作期间,它会导致长期的性能下降。

对于如何避免这个错误,有什么建议吗?顺便说一下,这个错误只发生在PL/SQL块中。

编辑:这里是完整的过程:

代码语言:javascript
运行
复制
procedure disable_indexes (
  tbl_name in varchar2
) as
  stmt varchar2(200);
  cursor curs(v_tbl_name in varchar2) is
    select 'alter index ' || index_name || ' unusable;' as ddl_stmt
    from user_indexes
    where upper(table_owner) = upper(user)
    and upper(table_name) = upper(v_tbl_name)
    and ityp_name in ('CTXCAT', 'ST_SPATIAL_INDEX');
begin
  for r_curs in curs(tbl_name) loop
    dbms_output.put_line(r_curs.ddl_stmt);
    execute immediate r_curs.ddl_stmt;
  end loop;
end;
EN

Stack Overflow用户

回答已采纳

发布于 2010-05-12 08:01:23

如果这确实是您的代码,而不是伪代码重写,则删除;stmt变量中语句末尾的位置(否则您将在执行过程中遇到ORA-00911: invalid character )。

现在,如果您的流程手动工作,您应该能够在一个过程中使它与execute immediate一起工作。确保这不是角色问题(请参阅此文章作者: Tom Kyte),在手动执行命令之前发出SET ROLE NONE

票数 5
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2814159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档