Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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中,什么样的字典表告诉我;储存在;分区索引的值?_Oracle_Data Structures_Plsql_Indexing_Metadata - Fatal编程技术网

在Oracle中,什么样的字典表告诉我;储存在;分区索引的值?

在Oracle中,什么样的字典表告诉我;储存在;分区索引的值?,oracle,data-structures,plsql,indexing,metadata,Oracle,Data Structures,Plsql,Indexing,Metadata,我们正在运行Oracle 11g,并且有一些分区表。我正在尝试编写一个自动化的过程来编写这些表上的索引。(基本上,当我们进行批量加载时,我们希望先删除所有索引,然后再重新创建它们。) 我的问题是知道如何编写分区索引的脚本。有些是用“本地存储在(表空间名)”创建的,而另一些只是用“本地”(将索引范围存储在与数据相同的分区中)创建的。在任何一种情况下,dba_index.tablespace_name都是null,我花了很长时间正确地编写了这两种不同情况的脚本 我知道我可以简单地重新运行原始的DDL

我们正在运行Oracle 11g,并且有一些分区表。我正在尝试编写一个自动化的过程来编写这些表上的索引。(基本上,当我们进行批量加载时,我们希望先删除所有索引,然后再重新创建它们。)

我的问题是知道如何编写分区索引的脚本。有些是用“本地存储在(表空间名)”创建的,而另一些只是用“本地”(将索引范围存储在与数据相同的分区中)创建的。在任何一种情况下,dba_index.tablespace_name都是null,我花了很长时间正确地编写了这两种不同情况的脚本

  • 我知道我可以简单地重新运行原始的DDL来重新创建索引,但是组织的多个部分可以进行更改,如果加载工具能够自包含并简单地重建最初的内容,那么风险就会更小

  • 我可以查询dba_ind_子分区,如果每个子分区的表空间名称值都匹配,那么我可以假设/推断我应该存储在该表空间名称中。但是,如果表处于一个小的单分区状态(例如,新创建的或刚刚存档之后),那么使用just LOCAL创建的表也符合此测试,因此这也不是区分它们的完美方法

  • 我可以将索引子分区表空间的名称与数据表分区表空间的名称进行比较,如果它们匹配,那么我可以假设/推断这些表空间应该仅使用本地创建。但是,这会将一堆额外的表拖到我的查询中,使其很难读取,因此我担心将来的可维护性。另外,这看起来像是一个乱七八糟的问题

  • 似乎Oracle的数据字典中应该有这样一个地方,它只是简单地跟踪这一点,我可以直接查找它,而不必做大量的数学运算和依赖于假设。但是,我已经做了大量的挖掘,还没有找到它。因此,任何帮助都将不胜感激

    比查询数据字典更容易:

    --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');