Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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_Plsql - Fatal编程技术网

向Oracle表中插入数据的最快方法是什么?

向Oracle表中插入数据的最快方法是什么?,oracle,plsql,Oracle,Plsql,我正在用PL/SQL编写一个数据转换,用于处理数据并将其加载到表中。根据PL/SQL分析器,转换过程中最慢的部分之一是实际插入到目标表中。该表只有一个索引 为了准备加载数据,我使用表的rowtype填充了一个变量,然后将其插入表中,如下所示: 插入mytable值r\u myRow 似乎我可以通过以下方式获得绩效: 在插入过程中关闭日志记录 一次插入多条记录 这些方法可取吗?如果是,语法是什么?删除索引,然后插入行,然后重新创建索引。检查此链接 关于你的主要考虑事项 case使用Appen

我正在用PL/SQL编写一个数据转换,用于处理数据并将其加载到表中。根据PL/SQL分析器,转换过程中最慢的部分之一是实际插入到目标表中。该表只有一个索引

为了准备加载数据,我使用表的rowtype填充了一个变量,然后将其插入表中,如下所示:

插入mytable值r\u myRow

似乎我可以通过以下方式获得绩效:

  • 在插入过程中关闭日志记录
  • 一次插入多条记录

这些方法可取吗?如果是,语法是什么?

删除索引,然后插入行,然后重新创建索引。

检查此链接

关于你的主要考虑事项 case使用Append-hint,如下所示 将直接追加到表中 而不是使用自由列表。如果您有能力关闭日志记录,那么可以使用带有nologging提示的append来关闭日志记录
  • 在PL/SQL中使用大容量插入而不是迭代
  • 如果从文件提要获取数据,请使用sqlloaded将数据直接加载到表中

  • 常规insert语句是获取表中数据的最慢方法,不适用于批量插入。下面的文章引用了许多不同的技术来提高性能:

    如果删除索引的速度不够快,则需要使用Oracle SQL*加载器


    最好一次插入几百行,使用PL/SQL表和FORALL绑定到insert语句中。有关详细信息,请参阅

    还要注意如何构造PL/SQL表。如果可能的话,您更愿意使用“INSERT INTO t1 SELECT…”直接在SQL中执行所有转换,因为在PL/SQL中执行逐行操作仍然比SQL慢

    在这两种情况下,您也可以通过使用
    INSERT/*+APPEND*/
    使用直接路径插入,这基本上绕过了数据库缓存,直接将新块分配和写入数据文件。这还可以减少日志记录量,具体取决于您如何使用它。这也有一些含义,因此请阅读第一部分


    最后,如果要截断和重建表,首先删除(或标记为不可用)然后重建索引可能是值得的。

    也许最好的选择之一是尽量避免使用Oracle。 我自己也对此感到困惑,但通常Java进程的性能会超过Oracle的许多实用程序,这些实用程序要么使用OCI(read:SQL Plus),要么会占用大量的时间(read:SQL*Loader)

    这也不会阻止您使用特定的提示(如/APPEND/)

    每次我求助于这种解决方案时,我都会感到惊喜

    干杯


    Rollo

    假设你接受了eid、ename、sal和job。因此,首先创建一个表,如下所示:

    SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10));
    
    现在插入数据:-

    SQL>insert into tablename values(&eid,'&ename',&sal,'&job');
    

    以下是我对fast insert的建议

    触发器-禁用与表关联的任何触发器。插入完成后启用

    索引-删除索引并在插入完成后重新创建

    过时统计数据-重新分析表和索引统计数据

    索引反碎片化-根据需要重建索引 不使用日志记录-使用Insert APPEND插入(仅限Oracle)。这种方法非常危险,不会生成重做日志,因此不能执行回滚-在开始之前备份表,不要尝试使用活动表。检查您的数据库是否有类似的选项

    并行插入:运行并行插入将加快作业速度

    使用批量插入 约束-在插入过程中没有太多开销,但是如果在步骤1之后仍然很慢,那么检查仍然是一个好主意


    您可以了解有关

    的更多信息,但使用批量插入方法将减轻索引的影响。您仍然可以使用与sql*loader相同的机制来优化负载,而无需借助命令行工具。该链接充满了可怕的建议。