Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用oracle集合解决内存问题?_Oracle_Plsql_Database Performance_Sql Tuning - Fatal编程技术网

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

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

我最近遇到了一个采访问题:我的会话中几乎没有可用的内存,我正在使用一个集合来存储游标获取的所有记录。由于内存不足,我的会话崩溃了。我将如何处理这个问题并优化会话的性能?

首先,这是一个假设性的问题。你说的记忆力差是什么意思?请和面试官核实一下。如果他们想检查方法,那么您可以在将记录填充到集合之前这样回答,确保您使用了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;

首先,这是一个假设性的问题。你说的记忆力差是什么意思?请和面试官核实一下。如果他们想检查方法,那么您可以在将记录填充到集合之前这样回答,确保您使用了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
的问题。另外,也许您不需要将整个记录保存在内存中。