如何使用 oracle 集合解决内存问题?

Posted

技术标签:

【中文标题】如何使用 oracle 集合解决内存问题?【英文标题】:How to solve memory problems using oracle collections? 【发布时间】:2020-05-21 13:32:57 【问题描述】:

我最近遇到了一个面试问题:我的会话中可用的内存非常少,我正在使用一个集合来存储游标获取的全部记录。由于内存不足,我的会话崩溃了。我将如何处理这个问题并优化会话的性能?

【问题讨论】:

我想他们问的是limit 子句和forall。另外,也许您不需要将整个记录保存在内存中。 【参考方案1】:

首先这是一个假设性问题。 Little memory 是什么意思?请与面试官确认。如果他们想检查该方法,那么您可以像在将记录填充到集合之前那样回答,确保您使用了 collection.delete 方法。尤其是当您在循环中迭代时。

您还可以在获取游标时使用 LIMIT 子句来控制内存。 除此之外,如果您的数据库版本是 12.1 或更高版本,您可以使用行限制子句来控制游标内存。对于经验:-

sql>
DECLARE
  CURSOR allrows_cur IS
    SELECT * FROM employees;
  TYPE employees_ntt IS TABLE OF employees%ROWTYPE;

  l_employees employees_ntt;
  l_row       PLS_INTEGER;
BEGIN
  --CLEAR  ARRAY TO LOAD RECORDS
  l_employees.DELETE;

  OPEN allrows_cur;

  LOOP
    FETCH allrows_cur BULK COLLECT
      INTO l_employees LIMIT 10;
    == > USE LIMIT Clause here EXIT WHEN l_employees.COUNT = 0;
  
    l_row := l_employees.FIRST;
    DBMS_OUTPUT.put_line('--------------------');
  
    WHILE (l_row IS NOT NULL) LOOP
      DBMS_OUTPUT.put_line(l_employees(l_row).last_name);
      l_row := l_employees.NEXT(l_row);
    END LOOP;
  END LOOP;

CLOSE allrows_cur;
l_employees.DELETE;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('ERR DTL-->' || sqlerrm);
END;

【讨论】:

以上是关于如何使用 oracle 集合解决内存问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中解决此内存错误

内存溢出的解决方法

plsql-Oracle 集合

你好,java 向数据库添加大量数据时内存溢出 在不改变内存的情况下如何解决? 你当时是怎么解决的

处理大型数据集和内存限制 [关闭]

ORACLE_修改实例的内存大小