gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:00:54 25 4
gpt4 key购买 nike

作为日常导入作业的一部分,我正在TRUNCATING 表数据并从原始文件插入数据。

有些表通常会导入大量数据,例如 200,000 行,而有些表会导入较少的数据,范围在 5,00030,000 行之间。

对于大表导入,插入过程中会花费很多时间,最后有时会以性能问题告终。

我正在使用 Java 处理导入到 Oracle 表中的操作。所以这个表不是硬编码的,而是根据他们的工作导入的。

jdbcTemplate.execute("TRUNCATE TABLE " + tableName);    --for truncating table

return "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 */ 不是一个好主意,因为它最终会影响性能问题。

最佳答案

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

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

200,000 行不是大量数据。 (除非每行包含存储在 LOB 列中的大文件。对于性能问题,谈论字节而不是行通常更有用。)如果我们大胆假设每行有 1,000 字节,那仍然只有 200 兆字节的数据。将 200 兆字节写入内存、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;

关于java - 我什么时候应该在 INSERT 期间使用/*+ APPEND */,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57786753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com