问题描述
我想比较下面的光标示例。我想知道哪一个对处理数据的1000万记录更好。
以及如何检查内部执行计划和内部流程。
以及如何检查内部执行计划和内部流程。
declare
type type_1 is table of user_tab_columns%rowtype;
cursor cursor_1(p_table_name varchar2) is
select * from user_tab_columns s where s.table_name = p_table_name;
v_type_1 type_1;
begin
open cursor_1('TABLE_NAME_1');
fetch cursor_1 bulk collect
into v_type_1;
close cursor_1;
for i in v_type_1.first .. v_type_1.last loop
dbms_output.put_line(' ' || v_type_1(i).column_id ||
' ' || v_type_1(i).column_name ||
' ' || v_type_1(i).data_type);
end loop;
end;
------------------------------------------------------------
declare
cursor cursor_2(p_table_name varchar2) is
select * from user_tab_columns s where s.table_name = p_table_name;
begin
for i in cursor_2('TABLE_NAME_1') loop
dbms_output.put_line(' ' || i.column_id || ' ' || i.column_name || ' ' ||
i.data_type);
end loop;
end;
------------------------------------------------------------
declare
cursor cursor_3(p_table_name varchar2) is
select * from user_tab_columns s where s.table_name = p_table_name;
v_type cursor_3%rowtype;
begin
open cursor_3('TABLE_NAME_1');
loop
fetch cursor_3
into v_type;
dbms_output.put_line(' ' || v_type.column_id || ' ' ||
v_type.column_name || ' ' || v_type.data_type);
exit when cursor_3%notfound;
end loop;
close cursor_3;
end;
专家解答
好吧,让我们称它们为cursor1,cursor2和cursor3
cursor1
对于小数据 (例如多达100万条记录) 来说很好,但是您正在将所有数据放入内存中,因此,如果您尝试将100亿行带回... 这可能会使您的会话崩溃
cursor2
可能会像cursor1一样快地运行,因为我们分批获取100,不会有任何内存问题,很容易编码
cursor3
一次获取1行,将是最慢的 (很长一段路)。如果您打算进行提取,但可能需要在少量记录后过早结束循环,则很好。
对于您的99% 代码,cursor2可能是您的转到选项。
cursor1
对于小数据 (例如多达100万条记录) 来说很好,但是您正在将所有数据放入内存中,因此,如果您尝试将100亿行带回... 这可能会使您的会话崩溃
cursor2
可能会像cursor1一样快地运行,因为我们分批获取100,不会有任何内存问题,很容易编码
cursor3
一次获取1行,将是最慢的 (很长一段路)。如果您打算进行提取,但可能需要在少量记录后过早结束循环,则很好。
对于您的99% 代码,cursor2可能是您的转到选项。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




