Oracle 如何在PLSQL存储过程中删除和重新创建索引

Oracle 如何在PLSQL存储过程中删除和重新创建索引,oracle,plsql,Oracle,Plsql,在PLSQL存储过程中,我希望删除索引并截断表 在将数据插入表之前。然后我想在以后重新创建索引。实现这一目标的最佳方式是什么 我需要类似的东西 Begin: Truncate Table Drop index1 Drop index2 loop --- other code Insert data commit; end loop; Create index1 Create index2 End; 具体而言,您可以根据自己的要求使用: Begin: execute immediat

在PLSQL存储过程中,我希望删除索引并截断表 在将数据插入表之前。然后我想在以后重新创建索引。实现这一目标的最佳方式是什么

我需要类似的东西

Begin:

Truncate Table
Drop index1
Drop  index2

loop
--- other code
Insert data
commit;
end loop;

Create index1
Create index2

End;
具体而言,您可以根据自己的要求使用:

Begin:

execute immediate 'truncate table statement';
execute immediate 'DROP index statement';

loop
--- other code
Insert data
commit;
end loop;

execute immediate 'Create index1 statement';
execute immediate 'Create index2 statement';

End;
具体而言,您可以根据自己的要求使用:

Begin:

execute immediate 'truncate table statement';
execute immediate 'DROP index statement';

loop
--- other code
Insert data
commit;
end loop;

execute immediate 'Create index1 statement';
execute immediate 'Create index2 statement';

End;

我们不能直接在PL/SQL中运行DDL

最好的方法是使用Oracle内置的
DBMS\u实用程序.EXEC\u DDL\u语句()。这些文件都有。但基本上:

begin
    DBMS_UTILITY.EXEC_DDL_STATEMENT('drop index index1')
    DBMS_UTILITY.EXEC_DDL_STATEMENT('drop index index2')
    DBMS_UTILITY.EXEC_DDL_STATEMENT('truncate table your_table')
    ....
请注意,这些命令是字符串而不是SQL


如果您插入了足够多的数据,从而值得删除和重新创建索引,那么您可能希望进行集合操作,而不是在循环中进行。集合操作处理数据块,而不是单个行。什么方法是合适的取决于你有多少数据


“我想从临时表插入数据,然后与其他表合并”

因此,最有效的途径可能是

 insert into your_table
 select /*+ append */  ....
 from staging_table
      join other_table
      on ...

但是,根据“巨大”的定义,您可能需要使用PL/SQL批量操作和FORALL插入。这将需要从暂存表中分块读取,因此需要一个循环

我们不能在PL/SQL中直接运行DDL

最好的方法是使用Oracle内置的
DBMS\u实用程序.EXEC\u DDL\u语句()。这些文件都有。但基本上:

begin
    DBMS_UTILITY.EXEC_DDL_STATEMENT('drop index index1')
    DBMS_UTILITY.EXEC_DDL_STATEMENT('drop index index2')
    DBMS_UTILITY.EXEC_DDL_STATEMENT('truncate table your_table')
    ....
请注意,这些命令是字符串而不是SQL


如果您插入了足够多的数据,从而值得删除和重新创建索引,那么您可能希望进行集合操作,而不是在循环中进行。集合操作处理数据块,而不是单个行。什么方法是合适的取决于你有多少数据


“我想从临时表插入数据,然后与其他表合并”

因此,最有效的途径可能是

 insert into your_table
 select /*+ append */  ....
 from staging_table
      join other_table
      on ...


但是,根据“巨大”的定义,您可能需要使用PL/SQL批量操作和FORALL插入。这将需要从暂存表中分块读取,因此需要一个循环

使用
executeimmediate
并将
COMMIT
移动到循环外部。确定。你能提供一些示例代码吗?我认为
commit
是不必要的,DB应该在DDL语句执行之前提交事务。“commit”有什么影响吗?它提交你的“Insert data”,但是如果你没有提交,结果将是一样的。DB,我猜在您的情况下,Oracle将在创建索引DDL语句之前自动提交您的事务。使用
executeimmediate
并将
COMMIT
移动到循环之外。Ok。你能提供一些示例代码吗?我认为
commit
是不必要的,DB应该在DDL语句执行之前提交事务。“commit”有什么影响吗?它提交你的“Insert data”,但是如果你没有提交,结果将是一样的。DB,我猜在您的情况下,Oracle将在创建索引DDL语句之前自动提交您的事务。谢谢。删除然后创建索引是好的还是不可用,然后重建?这取决于数据的大小和类型。大多数情况下,您需要对其进行基准测试并做出决定。这种方法很有用的一种情况是,索引导致插入/更新比删除和重新创建花费的时间更长。尽管如此,数据和资源的大小仍然会影响决策。您需要在您提到的“声明”中对您的方法进行基准测试(即,您需要同时运行这两种方法并查看损益差异)。与我们通常创建索引的语法相同。谢谢。删除然后创建索引是好的还是不可用,然后重建?这取决于数据的大小和类型。大多数情况下,您需要对其进行基准测试并做出决定。这种方法很有用的一种情况是,索引导致插入/更新比删除和重新创建花费的时间更长。尽管如此,数据和资源的大小仍然会影响决策。您需要在您提到的“声明”中对您的方法进行基准测试(即,您需要同时运行这两种方法并查看损益差异)。与我们通常创建索引的语法相同。您能详细说明集合操作吗?我想从暂存表插入数据,然后与其他表连接,最后插入到主表中。数据的大小有时很大,有时很大,这取决于暂存数据。我将尝试这种方法。谢谢。你们能详细说明集合操作吗?我想从暂存表插入数据,然后和其他表连接,最后插入到主表中。数据的大小有时很大,有时很大,这取决于暂存数据。我将尝试这种方法。谢谢APC