如何使用oracle集合解决内存问题?
我最近遇到了一个采访问题:我的会话中几乎没有可用的内存,我正在使用一个集合来存储游标获取的所有记录。由于内存不足,我的会话崩溃了。我将如何处理这个问题并优化会话的性能?首先,这是一个假设性的问题。你说的记忆力差是什么意思?请和面试官核实一下。如果他们想检查方法,那么您可以在将记录填充到集合之前这样回答,确保您使用了collection.delete方法,尤其是在循环中迭代时 您还可以在获取光标时使用LIMIT子句来控制内存。 除此之外,如果DB版本为12.1或更高,则可以使用row limit子句来控制游标内存。对于exp:-如何使用oracle集合解决内存问题?,oracle,plsql,database-performance,sql-tuning,Oracle,Plsql,Database Performance,Sql Tuning,我最近遇到了一个采访问题:我的会话中几乎没有可用的内存,我正在使用一个集合来存储游标获取的所有记录。由于内存不足,我的会话崩溃了。我将如何处理这个问题并优化会话的性能?首先,这是一个假设性的问题。你说的记忆力差是什么意思?请和面试官核实一下。如果他们想检查方法,那么您可以在将记录填充到集合之前这样回答,确保您使用了collection.delete方法,尤其是在循环中迭代时 您还可以在获取光标时使用LIMIT子句来控制内存。 除此之外,如果DB版本为12.1或更高,则可以使用row limit子
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;
首先,这是一个假设性的问题。你说的记忆力差是什么意思?请和面试官核实一下。如果他们想检查方法,那么您可以在将记录填充到集合之前这样回答,确保您使用了collection.delete方法,尤其是在循环中迭代时 您还可以在获取光标时使用LIMIT子句来控制内存。 除此之外,如果DB版本为12.1或更高,则可以使用row limit子句来控制游标内存。对于exp:-
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;
我想他们是在问关于
limit
和forall
的子句。另外,也许您不需要将整个记录保存在内存中。我想他们是在询问关于limit
子句和forall
的问题。另外,也许您不需要将整个记录保存在内存中。