为了账号安全,请及时绑定邮箱和手机立即绑定

我什么时候应该在 INSERT 期间使用 /*+ APPEND */

我什么时候应该在 INSERT 期间使用 /*+ APPEND */

呼啦一阵风 2023-07-13 13:41:29
作为日常导入作业的一部分,我是TRUNCATING表的数据并从原始文件插入数据。有些表通常会导入较大的数据,例如范围行中的数据200,000,但有些表会导入范围行中的较少5,000数据30,000。对于大型表导入,插入过程中会花费大量时间,最后有时会因性能问题而结束。我正在使用 Java 来处理 Oracle 表中的导入。所以这个表不是硬编码的,而是根据他们的工作导入的。jdbcTemplate.execute("TRUNCATE TABLE " + tableName);    --for truncating tablereturn "INSERT INTO " + tableName + " (" +                columnData.stream().filter(Objects::nonNull).map(ColumnData::getName).collect(joining(", ")) +                ", SYSTEM_INSERTED_AT) VALUES (" +                values.stream().collect(joining(", ")) +                ", CURRENT_TIMESTAMP)";  --for insertion into table我想知道在插入期间使用/*+ APPEND */提示是个好主意吗?它是否可以提高插入期间的性能?正如在 oracle 文章中所读到的那样,使用较少的插入并不是一个好主意,/*+ APPEND */因为它最终会影响性能问题。
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

您的程序几乎肯定不会从APPEND提示中受益。批处理命令更有可能提高性能。


当插入大量数据时,该APPEND提示很有帮助。它通过将数据直接写入数据文件并绕过更新内存结构、REDO 和 UNDO 来提高性能。但我们必须愿意接受那些捷径的后果——操作锁定了整个表,并且数据将无法恢复。


200,000 行并不是一个巨大的数据量。(除非每行包含存储在 LOB 列中的大文件。对于性能问题,谈论字节而不是行通常更有用。)如果我们大胆假设每行有 1,000 字节,那仍然只有 200 兆字节的数据。将 200 MB 写入内存、UNDO 和 REDO 不会增加超过几秒的运行时间。消除这些秒不会有太大帮助。


批处理是提高程序性能的最佳方法。每个数据库命令都有大量的开销,主要用于网络延迟和解析。组合多个命令可以显着减少开销并提高性能。


检查您的数据库 API 或框架是否有批处理选项。启用它可能就像更改配置一样简单。您不需要对所有内容进行批处理,只需一次合并一百行即可消除 99% 的开销


如果您没有批处理选项,可以通过连接字符串来构建您自己的解决方案。下面的代码演示了在单个命令中插入多行的两种不同方法。


create table table1(a number, b number);


insert into table1

select 1, 1 from dual union all

select 2, 2 from dual;


insert all

    into table1 values(3, 3)

    into table1 values(4, 4)

select * from dual;


查看完整回答
反对 回复 2023-07-13
  • 1 回答
  • 0 关注
  • 71 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信