set feedback on set pagesize 1000 ---------------------------------------------------------------------- -- Setup prerequisite objects for all methods ---------------------------------------------------------------------- drop table t10 ; drop table t10 * ERROR at line 1: ORA-00942: table or view does not exist create table t10 ( group_key varchar2(10) , val varchar2(10) ); Table created. insert into t10 select group_key , val from dual where 1=2 model dimension by ( 0 as i, cast ( null as varchar2(10) ) as group_key ) measures ( 'x' as val ) ( val [ for i from 1 to 100 increment 1, for group_key like '%' from 1000 to 1999 increment 1 ] = 'x' ) ; 100000 rows created. commit; Commit complete. select count(*) total_rows, count( distinct group_key ) distinct_group_keys from t10 ; TOTAL_ROWS DISTINCT_GROUP_KEYS ---------- ------------------- 100000 1000 1 row selected. select group_key, count( val ) vals from t10 where group_key = '1999' group by group_key ; GROUP_KEY VALS ---------- ---------- 1999 100 1 row selected. -- load rows from T10 into the SGA so the first method tested -- is not penalized for being the first to select from T10 set autotrace traceonly statistics select * from t10 ; 100000 rows selected. Statistics ---------------------------------------------------------- 4 recursive calls 0 db block gets 6925 consistent gets 0 physical reads 0 redo size 1847072 bytes sent via SQL*Net to client 73710 bytes received via SQL*Net from client 6668 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 100000 rows processed set autotrace off create table t10_group_keys as select distinct group_key from t10 ; Table created. create or replace function nested_table_to_csv ( p_table in varchar2_table_type , p_delimiter in varchar2 default ',' ) return varchar2 is ---------------------------------------------------------------------- -- Usage: -- -- p_table -- - contains the table you wish to convert to a string -- -- p_delimiter -- - contains the varchar2 string you want to see between each -- value in the returned string -- - default value is ',' (comma) -- - set it to null if you don't want any delimiters -- - e.g. p_delimiter => '/' returns -- -- a/b/c/d ---------------------------------------------------------------------- i binary_integer := p_table.first ; v_return varchar2(32767) := null ; begin while i is not null loop if i = p_table.first then v_return := p_table(i); else v_return := v_return || p_delimiter || p_table(i); end if; i := p_table.next(i) ; end loop; return( v_return ); end nested_table_to_csv; / Function created. show errors No errors. create or replace type stragg_type as object ( string varchar2(4000), static function ODCIAggregateInitialize ( sctx IN OUT stragg_type ) return number , member function ODCIAggregateIterate ( self IN OUT stragg_type , value IN varchar2 ) return number , member function ODCIAggregateTerminate ( self IN stragg_type, returnValue OUT varchar2, flags IN number ) return number , member function ODCIAggregateMerge ( self IN OUT stragg_type, ctx2 IN stragg_type ) return number ); / Type created. create or replace type body stragg_type is static function ODCIAggregateInitialize ( sctx IN OUT stragg_type ) return number is begin sctx := stragg_type( null ) ; return ODCIConst.Success ; end; member function ODCIAggregateIterate ( self IN OUT stragg_type , value IN varchar2 ) return number is begin self.string := self.string || ',' || value ; return ODCIConst.Success; end; member function ODCIAggregateTerminate ( self IN stragg_type , returnValue OUT varchar2 , flags IN number ) return number is begin returnValue := ltrim( self.string, ',' ); return ODCIConst.Success; end; member function ODCIAggregateMerge ( self IN OUT stragg_type , ctx2 IN stragg_type ) return number is begin self.string := self.string || ctx2.string; return ODCIConst.Success; end; end; / Type body created. create or replace function stragg ( input varchar2 ) return varchar2 deterministic parallel_enable aggregate using stragg_type ; / Function created. execute dbms_stats.gather_schema_stats( ownname => null ) PL/SQL procedure successfully completed. execute ssth_ctrl.drop_all_metrics ; PL/SQL procedure successfully completed. ---------------------------------------------------------------------- -- run each technique in a separate session ---------------------------------------------------------------------- spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 1' ); select group_key, substr( string, 2 ) as string from t10 model return updated rows partition by ( group_key ) dimension by ( row_number() over (partition by group_key order by 1) as key ) measures ( cast( val as varchar2(200) ) as string ) rules upsert iterate( 1000000 ) until ( presentv(string[iteration_number+2],1,0) = 0 ) ( string[0] = string[0] || ',' || string[iteration_number+1] ) order by group_key ; Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 184 consistent gets 0 physical reads 0 redo size 19073 bytes sent via SQL*Net to client 1110 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 1' ); spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 2' ); select group_key, string from t10_group_keys model reference r on ( select group_key , row_number() over ( partition by group_key order by 1 ) - 1 as position , val from t10 ) dimension by ( group_key, position ) measures ( val ) main m dimension by ( group_key ) measures ( cast( null as varchar2(200) ) as string ) rules update iterate( 100 ) ( string[ any ] = string[cv()] || case presentv( r.val[cv(group_key),iteration_number],1,0) when 0 then null else case iteration_number when 0 then null else ',' end || r.val[cv(group_key),iteration_number] end ) order by group_key ; Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 188 consistent gets 0 physical reads 0 redo size 19073 bytes sent via SQL*Net to client 1110 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 2' ); spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 2' ); select group_key, substr( string, 2 ) as string from t10 where 1=2 model reference r on ( select row_number() over (order by val) as val_number , group_key , val from t10 ) dimension by( val_number ) measures ( group_key, val ) main t_main dimension by( cast(null as integer) as i, group_key ) measures ( cast(null as varchar2(200)) as string ) rules upsert iterate( 1000000 ) until ( presentv(r.val[iteration_number+1],1,0) = 0 ) ( string [ for i from 1 to sign(iteration_number) increment 1, r.group_key[iteration_number] ] = string[cv(),cv()] || ',' || r.val[iteration_number] ) order by 1 ; Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 184 consistent gets 0 physical reads 0 redo size 19073 bytes sent via SQL*Net to client 1110 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 3' ); spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 4' ); select t10b.group_key , substr ( sys_connect_by_path( t10b.val, ',' ) , 2 ) as string from ( select group_key , val , row_number() over ( partition by group_key order by val ) as val_index from t10 ) t10b where connect_by_isleaf = 1 connect by val_index = prior val_index + 1 and group_key = prior group_key start with val_index = 1 ; Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 18584 consistent gets 0 physical reads 0 redo size 19073 bytes sent via SQL*Net to client 1110 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 202 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 4' ); spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 5' ); select group_key , NESTED_TABLE_TO_CSV ( cast( COLLECT(val) as VARCHAR2_TABLE_TYPE ) ) as string from t10 group by group_key ; Statistics ---------------------------------------------------------- 313 recursive calls 123 db block gets 375 consistent gets 1 physical reads 23892 redo size 19073 bytes sent via SQL*Net to client 1110 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 5 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 5' ); spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 6' ); select group_key , stragg( val ) as string from t10 group by group_key ; Statistics ---------------------------------------------------------- 55 recursive calls 0 db block gets 439 consistent gets 0 physical reads 0 redo size 19073 bytes sent via SQL*Net to client 1110 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 12 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 6' ); spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 7' ); select group_key , ltrim ( extract ( xmlagg( xmlelement( "V", ',' || val ) ), '/V/text()' ) , ',' ) as string from t10 group by group_key ; Statistics ---------------------------------------------------------- 3 recursive calls 0 db block gets 226 consistent gets 0 physical reads 0 redo size 19073 bytes sent via SQL*Net to client 1110 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 7' ); spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 8' ); select group_key , ( select substr(string,2) from table( t10a.string_table ) model return updated rows dimension by ( rownum as key ) measures ( cast( column_value as varchar2(200) ) as string ) rules upsert iterate( 1000000 ) until ( presentv(string[iteration_number+2],1,0) = 0 ) ( string[0] = string[0] || ',' || string[iteration_number+1] ) ) string from ( select group_key, cast( collect(val) as varchar2_table_type ) as string_table from t10 group by group_key ) t10a ; Statistics ---------------------------------------------------------- 12 recursive calls 0 db block gets 288 consistent gets 0 physical reads 0 redo size 19073 bytes sent via SQL*Net to client 1110 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 8' ); spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 9' ); select group_key, string from ( select group_key , row_number() over ( partition by group_key order by val ) as position , val || lead( ','||val, 1 ) over ( partition by group_key order by val ) || lead( ','||val, 2 ) over ( partition by group_key order by val ) || lead( ','||val, 3 ) over ( partition by group_key order by val ) || lead( ','||val, 4 ) over ( partition by group_key order by val ) || lead( ','||val, 5 ) over ( partition by group_key order by val ) || lead( ','||val, 6 ) over ( partition by group_key order by val ) || lead( ','||val, 7 ) over ( partition by group_key order by val ) || lead( ','||val, 8 ) over ( partition by group_key order by val ) || lead( ','||val, 9 ) over ( partition by group_key order by val ) || lead( ','||val, 10) over ( partition by group_key order by val ) || lead( ','||val, 11) over ( partition by group_key order by val ) || lead( ','||val, 12) over ( partition by group_key order by val ) || lead( ','||val, 13) over ( partition by group_key order by val ) || lead( ','||val, 14) over ( partition by group_key order by val ) || lead( ','||val, 15) over ( partition by group_key order by val ) || lead( ','||val, 16) over ( partition by group_key order by val ) || lead( ','||val, 17) over ( partition by group_key order by val ) || lead( ','||val, 18) over ( partition by group_key order by val ) || lead( ','||val, 19) over ( partition by group_key order by val ) || lead( ','||val, 20) over ( partition by group_key order by val ) || lead( ','||val, 21) over ( partition by group_key order by val ) || lead( ','||val, 22) over ( partition by group_key order by val ) || lead( ','||val, 23) over ( partition by group_key order by val ) || lead( ','||val, 24) over ( partition by group_key order by val ) || lead( ','||val, 25) over ( partition by group_key order by val ) || lead( ','||val, 26) over ( partition by group_key order by val ) || lead( ','||val, 27) over ( partition by group_key order by val ) || lead( ','||val, 28) over ( partition by group_key order by val ) || lead( ','||val, 29) over ( partition by group_key order by val ) || lead( ','||val, 30) over ( partition by group_key order by val ) || lead( ','||val, 31) over ( partition by group_key order by val ) || lead( ','||val, 32) over ( partition by group_key order by val ) || lead( ','||val, 33) over ( partition by group_key order by val ) || lead( ','||val, 34) over ( partition by group_key order by val ) || lead( ','||val, 35) over ( partition by group_key order by val ) || lead( ','||val, 36) over ( partition by group_key order by val ) || lead( ','||val, 37) over ( partition by group_key order by val ) || lead( ','||val, 38) over ( partition by group_key order by val ) || lead( ','||val, 39) over ( partition by group_key order by val ) || lead( ','||val, 40) over ( partition by group_key order by val ) || lead( ','||val, 41) over ( partition by group_key order by val ) || lead( ','||val, 42) over ( partition by group_key order by val ) || lead( ','||val, 43) over ( partition by group_key order by val ) || lead( ','||val, 44) over ( partition by group_key order by val ) || lead( ','||val, 45) over ( partition by group_key order by val ) || lead( ','||val, 46) over ( partition by group_key order by val ) || lead( ','||val, 47) over ( partition by group_key order by val ) || lead( ','||val, 48) over ( partition by group_key order by val ) || lead( ','||val, 49) over ( partition by group_key order by val ) || lead( ','||val, 50) over ( partition by group_key order by val ) || lead( ','||val, 51) over ( partition by group_key order by val ) || lead( ','||val, 52) over ( partition by group_key order by val ) || lead( ','||val, 53) over ( partition by group_key order by val ) || lead( ','||val, 54) over ( partition by group_key order by val ) || lead( ','||val, 55) over ( partition by group_key order by val ) || lead( ','||val, 56) over ( partition by group_key order by val ) || lead( ','||val, 57) over ( partition by group_key order by val ) || lead( ','||val, 58) over ( partition by group_key order by val ) || lead( ','||val, 59) over ( partition by group_key order by val ) || lead( ','||val, 60) over ( partition by group_key order by val ) || lead( ','||val, 61) over ( partition by group_key order by val ) || lead( ','||val, 62) over ( partition by group_key order by val ) || lead( ','||val, 63) over ( partition by group_key order by val ) || lead( ','||val, 64) over ( partition by group_key order by val ) || lead( ','||val, 65) over ( partition by group_key order by val ) || lead( ','||val, 66) over ( partition by group_key order by val ) || lead( ','||val, 67) over ( partition by group_key order by val ) || lead( ','||val, 68) over ( partition by group_key order by val ) || lead( ','||val, 69) over ( partition by group_key order by val ) || lead( ','||val, 70) over ( partition by group_key order by val ) || lead( ','||val, 71) over ( partition by group_key order by val ) || lead( ','||val, 72) over ( partition by group_key order by val ) || lead( ','||val, 73) over ( partition by group_key order by val ) || lead( ','||val, 74) over ( partition by group_key order by val ) || lead( ','||val, 75) over ( partition by group_key order by val ) || lead( ','||val, 76) over ( partition by group_key order by val ) || lead( ','||val, 77) over ( partition by group_key order by val ) || lead( ','||val, 78) over ( partition by group_key order by val ) || lead( ','||val, 79) over ( partition by group_key order by val ) || lead( ','||val, 80) over ( partition by group_key order by val ) || lead( ','||val, 81) over ( partition by group_key order by val ) || lead( ','||val, 82) over ( partition by group_key order by val ) || lead( ','||val, 83) over ( partition by group_key order by val ) || lead( ','||val, 84) over ( partition by group_key order by val ) || lead( ','||val, 85) over ( partition by group_key order by val ) || lead( ','||val, 86) over ( partition by group_key order by val ) || lead( ','||val, 87) over ( partition by group_key order by val ) || lead( ','||val, 88) over ( partition by group_key order by val ) || lead( ','||val, 89) over ( partition by group_key order by val ) || lead( ','||val, 90) over ( partition by group_key order by val ) || lead( ','||val, 91) over ( partition by group_key order by val ) || lead( ','||val, 92) over ( partition by group_key order by val ) || lead( ','||val, 93) over ( partition by group_key order by val ) || lead( ','||val, 94) over ( partition by group_key order by val ) || lead( ','||val, 95) over ( partition by group_key order by val ) || lead( ','||val, 96) over ( partition by group_key order by val ) || lead( ','||val, 97) over ( partition by group_key order by val ) || lead( ','||val, 98) over ( partition by group_key order by val ) || lead( ','||val, 99) over ( partition by group_key order by val ) as string from t10 ) where position = 1 ; Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 184 consistent gets 0 physical reads 0 redo size 19073 bytes sent via SQL*Net to client 6920 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 9' ); spool off ---------------------------------------------------------------------- -- new SQL*Plus session starts here ---------------------------------------------------------------------- column group_key format a10 column string format a50 truncate set autotrace traceonly statistics execute ssth_ctrl.start_test( 'Test 10' ); select group_key , max( decode( val_number, 1 , val, null ) ) || max( decode( val_number, 2 , ',' || val, null ) ) || max( decode( val_number, 3 , ',' || val, null ) ) || max( decode( val_number, 4 , ',' || val, null ) ) || max( decode( val_number, 5 , ',' || val, null ) ) || max( decode( val_number, 6 , ',' || val, null ) ) || max( decode( val_number, 7 , ',' || val, null ) ) || max( decode( val_number, 8 , ',' || val, null ) ) || max( decode( val_number, 9 , ',' || val, null ) ) || max( decode( val_number, 10, ',' || val, null ) ) || max( decode( val_number, 11, ',' || val, null ) ) || max( decode( val_number, 12, ',' || val, null ) ) || max( decode( val_number, 13, ',' || val, null ) ) || max( decode( val_number, 14, ',' || val, null ) ) || max( decode( val_number, 15, ',' || val, null ) ) || max( decode( val_number, 16, ',' || val, null ) ) || max( decode( val_number, 17, ',' || val, null ) ) || max( decode( val_number, 18, ',' || val, null ) ) || max( decode( val_number, 19, ',' || val, null ) ) || max( decode( val_number, 20, ',' || val, null ) ) || max( decode( val_number, 21, ',' || val, null ) ) || max( decode( val_number, 22, ',' || val, null ) ) || max( decode( val_number, 23, ',' || val, null ) ) || max( decode( val_number, 24, ',' || val, null ) ) || max( decode( val_number, 25, ',' || val, null ) ) || max( decode( val_number, 26, ',' || val, null ) ) || max( decode( val_number, 27, ',' || val, null ) ) || max( decode( val_number, 28, ',' || val, null ) ) || max( decode( val_number, 29, ',' || val, null ) ) || max( decode( val_number, 30, ',' || val, null ) ) || max( decode( val_number, 31, ',' || val, null ) ) || max( decode( val_number, 32, ',' || val, null ) ) || max( decode( val_number, 33, ',' || val, null ) ) || max( decode( val_number, 34, ',' || val, null ) ) || max( decode( val_number, 35, ',' || val, null ) ) || max( decode( val_number, 36, ',' || val, null ) ) || max( decode( val_number, 37, ',' || val, null ) ) || max( decode( val_number, 38, ',' || val, null ) ) || max( decode( val_number, 39, ',' || val, null ) ) || max( decode( val_number, 40, ',' || val, null ) ) || max( decode( val_number, 41, ',' || val, null ) ) || max( decode( val_number, 42, ',' || val, null ) ) || max( decode( val_number, 43, ',' || val, null ) ) || max( decode( val_number, 44, ',' || val, null ) ) || max( decode( val_number, 45, ',' || val, null ) ) || max( decode( val_number, 46, ',' || val, null ) ) || max( decode( val_number, 47, ',' || val, null ) ) || max( decode( val_number, 48, ',' || val, null ) ) || max( decode( val_number, 49, ',' || val, null ) ) || max( decode( val_number, 50, ',' || val, null ) ) || max( decode( val_number, 51, ',' || val, null ) ) || max( decode( val_number, 52, ',' || val, null ) ) || max( decode( val_number, 53, ',' || val, null ) ) || max( decode( val_number, 54, ',' || val, null ) ) || max( decode( val_number, 55, ',' || val, null ) ) || max( decode( val_number, 56, ',' || val, null ) ) || max( decode( val_number, 57, ',' || val, null ) ) || max( decode( val_number, 58, ',' || val, null ) ) || max( decode( val_number, 59, ',' || val, null ) ) || max( decode( val_number, 60, ',' || val, null ) ) || max( decode( val_number, 61, ',' || val, null ) ) || max( decode( val_number, 62, ',' || val, null ) ) || max( decode( val_number, 63, ',' || val, null ) ) || max( decode( val_number, 64, ',' || val, null ) ) || max( decode( val_number, 65, ',' || val, null ) ) || max( decode( val_number, 66, ',' || val, null ) ) || max( decode( val_number, 67, ',' || val, null ) ) || max( decode( val_number, 68, ',' || val, null ) ) || max( decode( val_number, 69, ',' || val, null ) ) || max( decode( val_number, 70, ',' || val, null ) ) || max( decode( val_number, 71, ',' || val, null ) ) || max( decode( val_number, 72, ',' || val, null ) ) || max( decode( val_number, 73, ',' || val, null ) ) || max( decode( val_number, 74, ',' || val, null ) ) || max( decode( val_number, 75, ',' || val, null ) ) || max( decode( val_number, 76, ',' || val, null ) ) || max( decode( val_number, 77, ',' || val, null ) ) || max( decode( val_number, 78, ',' || val, null ) ) || max( decode( val_number, 79, ',' || val, null ) ) || max( decode( val_number, 80, ',' || val, null ) ) || max( decode( val_number, 81, ',' || val, null ) ) || max( decode( val_number, 82, ',' || val, null ) ) || max( decode( val_number, 83, ',' || val, null ) ) || max( decode( val_number, 84, ',' || val, null ) ) || max( decode( val_number, 85, ',' || val, null ) ) || max( decode( val_number, 86, ',' || val, null ) ) || max( decode( val_number, 87, ',' || val, null ) ) || max( decode( val_number, 88, ',' || val, null ) ) || max( decode( val_number, 89, ',' || val, null ) ) || max( decode( val_number, 90, ',' || val, null ) ) || max( decode( val_number, 91, ',' || val, null ) ) || max( decode( val_number, 92, ',' || val, null ) ) || max( decode( val_number, 93, ',' || val, null ) ) || max( decode( val_number, 94, ',' || val, null ) ) || max( decode( val_number, 95, ',' || val, null ) ) || max( decode( val_number, 96, ',' || val, null ) ) || max( decode( val_number, 97, ',' || val, null ) ) || max( decode( val_number, 98, ',' || val, null ) ) || max( decode( val_number, 99, ',' || val, null ) ) as string from ( select group_key, row_number() over ( partition by group_key order by val ) as val_number , val from t10 ) t10a group by group_key order by group_key ; Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 184 consistent gets 0 physical reads 0 redo size 19071 bytes sent via SQL*Net to client 5011 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1000 rows processed execute ssth_ctrl.stop_test( 'Test 10' ); spool off