In the last post on this topic it turned out that using an array as a column type needs more space than using a column per value in PostgreSQL. Now I’ll do the same test case in Oracle.
As with the PostgreSQL test case I’ll create two test tables in Oracle: One using 10 columns and one just using one column of type varray:
SQL> create table single_values ( a number, b number, c number, d number, e number, f number, g number, h number, i number, j number ); Table created. SQL> create type typ_num_arr as varray(10) of number; 2 / Type created. SQL> create table arr_values ( a typ_num_arr ); Table created.
The same logic will be used to populate the tables:
set timi on truncate table single_values; declare ln number := 1000; begin for i in 0..1e6 loop insert into single_values (a,b,c,d,e,f,g,h,i,j) values (ln,ln,ln,ln,ln,ln,ln,ln,ln,ln); end loop; end; / commit; Table truncated. Elapsed: 00:00:00.07 PL/SQL procedure successfully completed. Elapsed: 00:00:29.56 Commit complete. Elapsed: 00:00:00.00 SQL>
For the table using the varray:
set timi on truncate table arr_values; declare ln number := 1000; lt typ_num_arr := typ_num_arr(ln,ln,ln,ln,ln,ln,ln,ln,ln,ln); begin for i in 0..1e6 loop insert into arr_values (a) values (lt); end loop; end; / commit; Table truncated. Elapsed: 00:00:00.01 PL/SQL procedure successfully completed. Elapsed: 00:00:33.05 Commit complete. Elapsed: 00:00:00.01
Now, what about the space the two tables have allocated:
SQL> select sum(bytes)/1024/1024 MB from dba_extents where SEGMENT_NAME = 'SINGLE_VALUES'; MB ---------- 38 Elapsed: 00:00:00.23 SQL> select sum(bytes)/1024/1024 MB from dba_extents where SEGMENT_NAME = 'ARR_VALUES'; MB ---------- 47 Elapsed: 00:00:00.20 SQL>
The same behavior as in PostgreSQL. The table with the varray needs more space than the table with the columns per value.