批量收集和游标之间的区别
Difference between bulk collect and cursor
我想知道使用批量收集然后在结果上循环与使用游标之间有什么区别。和子问题:是否存在唯一选项是游标的情况?
谢谢
Oracle 隐式优化 PL/SQL for-cursor-loop 以使用 100 行的提取,因此它类似于批量收集限制 100。
简单示例:
SQL> begin
2 for r in (select/*+findme*/ level n from dual connect by level<=100) loop
3 exit;
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed.
SQL> select fetches, rows_processed,sql_text
2 from v$sql
3 where lower(sql_text) like 'select/*+findme*/%';
FETCHES ROWS_PROCESSED SQL_TEXT
---------- -------------- ----------------------------------------------------------
1 100 SELECT/*+findme*/ LEVEL N FROM DUAL CONNECT BY LEVEL<=100
1 row selected.
注意:这种优化仅在 plsql_optmize_level
参数>=2(默认值=2)时有效。在 plsql_optmize_level
< 2 的情况下,for-loop 获取 1 行。你可以试试改一下看看有什么不同
PS。 + 你不能在动态 sql
中使用游标 for-loop
我想知道使用批量收集然后在结果上循环与使用游标之间有什么区别。和子问题:是否存在唯一选项是游标的情况? 谢谢
Oracle 隐式优化 PL/SQL for-cursor-loop 以使用 100 行的提取,因此它类似于批量收集限制 100。
简单示例:
SQL> begin
2 for r in (select/*+findme*/ level n from dual connect by level<=100) loop
3 exit;
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed.
SQL> select fetches, rows_processed,sql_text
2 from v$sql
3 where lower(sql_text) like 'select/*+findme*/%';
FETCHES ROWS_PROCESSED SQL_TEXT
---------- -------------- ----------------------------------------------------------
1 100 SELECT/*+findme*/ LEVEL N FROM DUAL CONNECT BY LEVEL<=100
1 row selected.
注意:这种优化仅在 plsql_optmize_level
参数>=2(默认值=2)时有效。在 plsql_optmize_level
< 2 的情况下,for-loop 获取 1 行。你可以试试改一下看看有什么不同
PS。 + 你不能在动态 sql
中使用游标 for-loop