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

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

【问题讨论】:

  • 我想他们问的是limit 子句和forall。另外,也许您不需要将整个记录保存在内存中。

标签: oracle plsql database-performance sql-tuning


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 2020-10-24
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多