我编写了一个PL / SQL过程,如果首先禁用索引,然后在完成时重建索引,这将有好处。 existing thread建议采用这种方法:
alter session set skip_unusable_indexes = true;
alter index your_index unusable;
[do import]
alter index your_index rebuild;
但是,我在第一个alter index
语句中收到以下错误:
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
问题索引定义如下:
CREATE INDEX A11_IX1 ON STREETS ("SHAPE")
INDEXTYPE IS "SDE"."ST_SPATIAL_INDEX" PARAMETERS
('ST_GRIDS=890,8010,72090 ST_SRID=2');
这是来自第三方供应商的自定义索引类型,在高容量更新/插入/删除操作期间会导致长期性能下降。
有关如何解决此错误的任何建议?顺便说一句,此错误仅发生在PL / SQL块中。
编辑:以下是整个程序:
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;
答案 0 :(得分:5)
如果这确实是您的代码而不是伪代码重写,请删除;
变量中语句末尾的stmt
(否则您将遇到ORA-00911: invalid character
期间执行)
现在,如果您的流程是手动运行的,那么您应该能够在过程中使用execute immediate
。在手动执行命令之前发出SET ROLE NONE
,确保这不是角色问题(请参阅此article by Tom Kyte。)
答案 1 :(得分:0)
您之前尝试过DROP INDEX,然后在之后重新创建吗?