如何使用 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 集合解决内存问题?的主要内容,如果未能解决你的问题,请参考以下文章