【问题标题】:Most Effective way to search a value in a list of values [ORACLE SQL]在值列表中搜索值的最有效方法 [ORACLE SQL]
【发布时间】:2021-10-13 23:59:13
【问题描述】:

我正在尝试使用 SQL 在值列表中查找一个值,因此我尝试使用以下内容:

SELECT * FROM TABLE_EXAMPLE WHERE FIELD_EXAMPLE IN ('1', '2', '3', '4', '5', ...)

我正在搜索的值列表有大约 84k 个元素,因此我不能使用这种类型的查询,因为列表太大,我会收到错误消息。

即使在非常大的列表中搜索,是否有一种有效的方法来执行此类查询?

我实施的解决方案是将查询分解为更简单的查询,所以我最终得到了这样的结果:

select * from table_example where field_example = '1';
select * from table_example where field_example = '2';
select * from table_example where field_example = '3';
select * from table_example where field_example = '4';
select * from table_example where field_example = '5';

等等……

【问题讨论】:

  • 将列表加载到表中,使用JOIN等SQL操作。
  • @GordonLinoff 是对的;这是唯一合理的方法。如您所知,IN( 子句仅限于 256 个元素,因此除非您嵌套一大堆元素,否则不是一个选项。如果您的 84,000 个元素位于与 Oracle 数据库位于同一服务器上的平面文件中,并且它采用合理的格式,例如 CSV 或固定长度等,您可以使用外部表将其视为是一个数据库表并加入它。如果是这样,edit 您的问题并显示该文件中的一些示例行。还要为您的版本添加一个版本标签,例如 [oracle12c]。

标签: sql oracle performance


【解决方案1】:

你可以通过两种方式解决这个问题:

  • 将所有 84k 搜索数据加载到一个表中,并将该表与 TABLE_EXAMPLE 的连接一起使用。在这种情况下,添加搜索的标识符会很有用,以便您可以将此表与搜索不同值的并发查询一起使用
  • 将您的 84k 记录拆分为一个较小的集合,以便您的查询可以处理,并使用限制为合理数量的搜索值的原始 SELECT * FROM TABLE_EXAMPLE WHERE FIELD_EXAMPLE IN ('1', '2', '3', '4', '5', ...)

在表格中加载搜索到的数据

这里是使用 SEARCHED_DATA 表解决方案的所有步骤的描述。

  • 创建一个包含 FIELD_EXAMPLE 和 SEARCH_ID 列的 SEARCHED_DATA 表。
  • 创建要在 SEARCH_ID 字段中使用的唯一 ID
  • 将 SEARCHED_DATA 中的 84k 条记录添加到之前生成的相同 SEARCH_ID 中
  • 使用两个表之间的内连接进行选择:`SELECT T.* FROM TABLE_EXAMPLE T INNER JOIN SEARCHED_DATA S ON T.FIELD_EXAMPLE = S.FIELD_EXAMPLE 和 S.SEARCH_ID = 'CREATEDID'
  • 检索到所需的所有数据后,从 SEARCHED_DATA 中删除带有 SEARCH_ID 的记录

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2011-03-05
    • 2020-08-21
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多