问题描述
嗨,
我想知道下面两个示例之间的内存使用/分配是否有任何差异。
单个varchar列与多列表类型。
我想知道下面两个示例之间的内存使用/分配是否有任何差异。
单个varchar列与多列表类型。
declare
type t_rec is record (id integer,
fname varchar2(20),
lname varchar2(20),
street varchar2(30),
hnum number(4)
);
type t_tab is table of rec;
l_tab tab;
begin
l_tab := t_tab();
select id
, first_name fname
, last_name lname
, street
, hnum
bulk collect into l_tab
from my_data;
end;
/
-- vs
declare
type t_tab is table of varchar2(200);
l_tab tab;
begin
l_tab := t_tab();
select ':id:'||to_char(id)||':first_name:'||first_name||':last_name:'||last_name||':street:'||street||':hnum:'||to_char(hnum)
bulk collect into l_tab
from my_data;
end;
/专家解答
当你意识到有人甚至没有花时间看看他们的代码是否会编译的那一刻:-(
无论如何... 一旦解决了该问题,内存利用率就会有所不同,但是您实际上必须进入非常大的数据量才能成为问题
SQL> declare
2 type t_rec is record (id integer,
3 fname varchar2(20),
4 lname varchar2(20),
5 street varchar2(30),
6 hnum number(10)
7 );
8 type t_tab is table of rec;
9 l_tab tab;
10 begin
11 l_tab := t_tab();
12 select id
13 , first_name fname
14 , last_name lname
15 , street
16 , hnum
17 bulk collect into l_tab
18 from my_data;
19 end;
20 /
type t_tab is table of rec;
*
ERROR at line 8:
ORA-06550: line 8, column 25:
PLS-00201: identifier 'REC' must be declared
ORA-06550: line 8, column 2:
PL/SQL: Item ignored
ORA-06550: line 9, column 8:
PLS-00488: 'TAB' must be a type
ORA-06550: line 9, column 8:
PL/SQL: Item ignored
ORA-06550: line 11, column 2:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 11, column 2:
PL/SQL: Statement ignored
ORA-06550: line 12, column 9:
PL/SQL: ORA-00904: "ID": invalid identifier
ORA-06550: line 12, column 2:
PL/SQL: SQL Statement ignored
无论如何... 一旦解决了该问题,内存利用率就会有所不同,但是您实际上必须进入非常大的数据量才能成为问题
SQL> create table my_data as
2 select rownum id,
3 rpad('x',20,'x') first_name,
4 rpad('x',20,'x') last_name,
5 rpad('x',30,'x') street,
6 rownum hnum
7 from dual
8 connect by level <= 100000;
Table created.
SQL> declare
2 type t_rec is record (id integer,
3 fname varchar2(20),
4 lname varchar2(20),
5 street varchar2(30),
6 hnum number(10)
7 );
8 type t_tab is table of t_rec;
9 l_tab t_tab;
10 begin
11 l_tab := t_tab();
12 select id
13 , first_name fname
14 , last_name lname
15 , street
16 , hnum
17 bulk collect into l_tab
18 from my_data;
19 end;
20 /
PL/SQL procedure successfully completed.
SQL>
SQL> select
2 s.name, st.value
3 from v$statname s, v$mystat st
4 where st.statistic# = s.statistic#
5 and s.name like 'session pga%';
NAME VALUE
---------------------------------------------------------------- ----------
session pga memory 3722696
session pga memory max 35245512
SQL> declare
2 type t_tab is table of varchar2(200);
3 l_tab t_tab;
4 begin
5 l_tab := t_tab();
6 select ':id:'||to_char(id)||':first_name:'||first_name||':last_name:'||last_name||':street:'||street||':hnum:'||to_char(hnum)
7 bulk collect into l_tab
8 from my_data;
9 end;
10 /
PL/SQL procedure successfully completed.
SQL>
SQL> select
2 s.name, st.value
3 from v$statname s, v$mystat st
4 where st.statistic# = s.statistic#
5 and s.name like 'session pga%';
NAME VALUE
---------------------------------------------------------------- ----------
session pga memory 3722696
session pga memory max 20303304
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




