gpt4 book ai didi

java - 使用 JDBC 从 Oracle 11g 中删除记录

转载 作者:行者123 更新时间:2023-12-01 16:54:05 24 4
gpt4 key购买 nike

我需要从包含 900 万条记录的表中删除 10 000 条记录。要删除的 ID 将从复杂的查询中获取并存储在 Java 集合中。

我有 3 种方法来实现这个

1) 创建一个准备好的语句并将 10000 个语句添加到批处理中并执行它。

声明将如下所示

Delete from <table_name> where id=?;

2) 在批处理中编写“in”查询而不是使用“=”。喜欢

在此情况下,可以在 Java 代码中将 10 000 个 ID 创建为逗号分隔值并将其添加到查询中。或者,将 10000 个 ID 插入到临时表中,并在子查询中从该表中进行选择。

Delete from <table_name> where id in (<CSV>);
or
Delete from <table_name> where id in (select id from <temp_table>);

表中没有约束和索引。我无法添加一个,因为我正在处理现有的表。

第一个选项需要很长时间才能完成。它已经运行了 15 小时,但仍未完成。

最佳答案

您的第一个版本有 1000 个值的限制,并且往往表现不佳。第二种方法可能性能更好,但您必须有一个全局临时表,并且填充它是一个额外的步骤。

您可以将 Java 集合转换为 Oracle 集合。您可以为此创建自己的表类型,但也可以在此处使用内置的表类型,例如 ODCINUMBERLIST。您可以将其视为表集合表达式。

详细信息可能会略有不同,具体取决于您的 Java 集合类型,但概要如下:

ArrayDescriptor aDesc = ArrayDescriptor.createDescriptor("SYS.ODCINUMBERLIST",
conn);
oracle.sql.ARRAY oraIDs = new oracle.sql.ARRAY(aDesc, conn, yourJavaCollectinOfIDs);

cStmt = (OracleCallableStatement) conn.prepareCall(
"Delete from <table_name>
where id in (select column_value from table(?))");
cStmt.setArray(1, oraIDs);
cStmt.execute();

除非它已经是一个简单的数组,否则您需要在调用中将 Java 集合转换为数组;例如如果您使用名为 yourArrayList 的 ArrayList,您将执行以下操作:

oracle.sql.ARRAY oraIDs = new oracle.sql.ARRAY(aDesc, conn, yourArrayList.toArray());

您仍然会遭受缺少主键或索引的困扰,但与 CSV 列表(或多个 CSV 列表 OR 在一起,因为您有超过 1000 个 ID)相比,它会给 Oracle 带来更好的优化机会。

关于java - 使用 JDBC 从 Oracle 11g 中删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35218501/

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