Oracle:如何根据大量ID过滤结果[20K]

时间:2016-01-06 11:27:16

标签: database oracle

我得到一个文件作为输入,我必须加载与文件中存在的所有ID相对应的数据[在内存中]。

我试过了。

  • 将ID插入临时表,然后进行连接,但就是这样 为并行运行创建问题。意味着多个相同的实例 应用程序无法共享相同的临时表。在这里,我不能创建一个 每次执行临时表。

  • '在`子句中,我可以传递ID列表,但是有限制 查询的大小。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

创建global temporary table。表定义是共享的,但每个会话都有自己的一组私有数据。

答案 1 :(得分:1)

您可以批量加载数据。 Oracle的{{1}}限制为1k,因此您可以安全地按批次500个ID加载条目。

最佳解决方案显然取决于您的具体情况,但这对大多数情况都适用。它不涉及写操作(如插入临时表),因此DB(事务日志)没有额外的压力,不需要清理作业,节省重做日志等。

答案 2 :(得分:0)

使用集合:

CREATE TYPE number_tt IS TABLE OF NUMBER(8,0);
/

VARIABLE ids REFCURSOR;
/

DECLARE
  t_ids number_tt := number_tt();
BEGIN
  -- Loop through file to get IDs
  FOR id IN 1 .. 20000 LOOP
    t_ids.EXTEND;
    t_ids(t_ids.COUNT) := id;
  END LOOP;

  -- Use MEMBER OF instead of IN
  OPEN :ids FOR
  SELECT LEVEL
  FROM DUAL
  CONNECT BY LEVEL MEMBER OF t_ids;
END;
/

PRINT ids;