【发布时间】:2020-05-21 13:32:57
【问题描述】:
我最近遇到了一个面试问题:我的会话中可用的内存非常少,我正在使用一个集合来存储游标获取的全部记录。由于内存不足,我的会话崩溃了。我将如何处理这个问题并优化会话的性能?
【问题讨论】:
-
我想他们问的是
limit子句和forall。另外,也许您不需要将整个记录保存在内存中。
标签: oracle plsql database-performance sql-tuning
我最近遇到了一个面试问题:我的会话中可用的内存非常少,我正在使用一个集合来存储游标获取的全部记录。由于内存不足,我的会话崩溃了。我将如何处理这个问题并优化会话的性能?
【问题讨论】:
limit 子句和forall。另外,也许您不需要将整个记录保存在内存中。
标签: oracle plsql database-performance sql-tuning
首先这是一个假设性问题。 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;
【讨论】: