在Oracle中,什么样的字典表告诉我;储存在;分区索引的值?
我们正在运行Oracle 11g,并且有一些分区表。我正在尝试编写一个自动化的过程来编写这些表上的索引。(基本上,当我们进行批量加载时,我们希望先删除所有索引,然后再重新创建它们。) 我的问题是知道如何编写分区索引的脚本。有些是用“本地存储在(表空间名)”创建的,而另一些只是用“本地”(将索引范围存储在与数据相同的分区中)创建的。在任何一种情况下,dba_index.tablespace_name都是null,我花了很长时间正确地编写了这两种不同情况的脚本在Oracle中,什么样的字典表告诉我;储存在;分区索引的值?,oracle,data-structures,plsql,indexing,metadata,Oracle,Data Structures,Plsql,Indexing,Metadata,我们正在运行Oracle 11g,并且有一些分区表。我正在尝试编写一个自动化的过程来编写这些表上的索引。(基本上,当我们进行批量加载时,我们希望先删除所有索引,然后再重新创建它们。) 我的问题是知道如何编写分区索引的脚本。有些是用“本地存储在(表空间名)”创建的,而另一些只是用“本地”(将索引范围存储在与数据相同的分区中)创建的。在任何一种情况下,dba_index.tablespace_name都是null,我花了很长时间正确地编写了这两种不同情况的脚本 我知道我可以简单地重新运行原始的DDL
--Sample table and index.
create table test1(a number);
create index test1_idx on test1(a);
--Store the DDL, drop the index, then re-create it.
declare
ddl_before clob;
begin
ddl_before := dbms_metadata.get_ddl('INDEX', 'TEST1_IDX');
execute immediate 'drop index test1_idx';
--Do some processing here.
execute immediate ddl_before;
end;
/
比查询数据字典更容易:
--Sample table and index.
create table test1(a number);
create index test1_idx on test1(a);
--Store the DDL, drop the index, then re-create it.
declare
ddl_before clob;
begin
ddl_before := dbms_metadata.get_ddl('INDEX', 'TEST1_IDX');
execute immediate 'drop index test1_idx';
--Do some processing here.
execute immediate ddl_before;
end;
/
正如jonearles所描述的,dbms_元数据包是为现有对象生成DDL的方法 但是,在我看来,这比你想要达到的目标所需要的工作要多。如果这都是为了加载数据,我建议您只需将索引更改为不可用,设置“skip_unusable_indexes=true”,进行数据加载,然后重新生成索引
这应该可以实现您想要的功能,而无需删除和重新创建索引。正如jonearles所描述的,dbms_元数据包是为现有对象生成DDL的方法 但是,在我看来,这比你想要达到的目标所需要的工作要多。如果这都是为了加载数据,我建议您只需将索引更改为不可用,设置“skip_unusable_indexes=true”,进行数据加载,然后重新生成索引
这应该可以实现您想要的功能,而不必删除和重新创建索引。虽然在没有索引的情况下,单独插入的速度更快,但您是否对启用索引的表中的负载进行了基准测试,并确定它比禁用(比删除更健壮!)和重建它们的速度慢
当您将path insert定向到具有索引的表中时,Oracle通过创建临时段以仅保存索引生成所需的数据来优化索引维护过程。这通常允许索引维护扫描比其他要求小得多的段——临时段加上现有索引。尽管在没有索引的情况下单独插入会更快,但您是否对启用索引的表中的加载进行了基准测试,并确定其慢于禁用索引(比坠落更坚固!)并重建它们
当您将path insert直接插入到具有索引的表中时,Oracle通过创建临时段来优化索引维护过程,以仅保存索引生成所需的数据。这通常允许索引维护扫描比其他要求小得多的段—临时段加上现有索引。我得到了架构“系统”中找不到的类型索引的
对象“indexname”
。解决方案是包括额外的“schema”参数,如:ddl\u before:=dbms\u元数据。get\u ddl('INDEX','TEST1_IDX','schema_NAME');
。第一次尝试时,我得到了架构“系统”中找不到的类型索引的对象“indexname”
。解决方案是包括额外的“schema”参数,如:ddl\u before:=dbms\u元数据。获取\u ddl('INDEX','TEST1\u IDX','schema\u NAME');
。