【问题标题】:Oracle DB Query search using IN operator for 200 000+ search stringsOracle DB Query 使用 IN 运算符搜索 200 000 多个搜索字符串
【发布时间】:2020-09-26 04:57:37
【问题描述】:

我有一个用户上传了一个包含 20 万行 IP 的 csv。我必须验证上传的 IP 是否已存在于数据库中。查询数据库的优化方式是什么?

我正在使用休眠连接到 Oracle 数据库,并且我知道 IN 查询运算符接受有限的值 (1000)。因此,要获取 200k 个值,它将执行 200 个查询,这既耗时又不是优化的方式。

查询数据库的最佳方法是什么?

【问题讨论】:

  • 将数据上传到单独的(临时?)表并执行 JOIN 或 WHERE id IN 查询。在对面表中的id 上创建索引。
  • 使用单个 MERGE 语句从 krokodilko 建议的临时表到使用 IP 作为过滤器/连接的永久表。

标签: database oracle spring-boot hibernate spring-data-jpa


【解决方案1】:

如果您预计会有很多冲突(数据库中已经上传了 IP),我会选择提到的临时表方法 krokodilko 和 pmdba。通常,我什至会计算现有数据和上传数据之间的增量,并记录这些数字(已知 120.000 个 ips,25.000 个新 ips)以获得一些统计信息。

另一方面,如果您不希望发生冲突,而只是想保护您的数据免受重复,我会使用错误记录方法:

CREATE TABLE t (ip VARCHAR2(15) NOT NULL CONSTRAINT pkt PRIMARY KEY);

EXEC DBMS_ERRLOG.CREATE_ERROR_LOG(dml_table_name => 't');

现在您有了表 t 和错误日志表 err$_t,您可以使用它们来捕获违规行:

INSERT INTO t (ip) VALUES ('127.0.0.1') LOG ERRORS;
1 row inserted.

INSERT INTO t (ip) VALUES ('127.0.0.1') LOG ERRORS;
0 rows inserted.
ORA-00001: unique constraint (SO.PKT) violated

SELECT ip, ora_err_mesg$ FROM err$_t;
IP          ORA_ERR_MESG$
127.0.0.1   ORA-00001: unique constraint (SO.PKT) violated

【讨论】:

  • 感谢您的回答,但在我的情况下可能会有很多冲突。
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 2011-01-02
  • 2018-12-06
  • 2016-03-03
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多