Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> Re: Global Temporary Table Scalability Problem
Hi all,
Thanks greatly for your responses regarding this slow temporary table performance.
My DB version, btw, is 8.1.7 (forgot to include this info).
Here's some follow up to your suggestions/questions. TKProf output
follows
at the end.
>One workaround, since you have a fairly static
>size, is to use the dbms_stats package to create
>stats on the GTT definition.
On your suggestinot I tried this, but dbms_stats.gather_table_stats
gave me an error:
ora-20000 Gatheringing statistics for a temporary table is not
supported.
>what about a hint of some sort?
We already use the /*+ ordered */ hint to help identify the primary
table..Maybe another hint would get it to go at the indexes on the
temporary table more efficiently.
>would you be able to use SELECT FROM TABLE(CAST...) syntax or a
pipelined
>function instead of the temp table (depending on version)?
I had in the past used some fancy sql to cast a comma delimited list
to a user-defined type ,i.e. like this:
where expert_item_enum IN
SELECT * FROM
THE
( SELECT cast( Pkg_Util.In_List (question_area_enum_list_in) AS codetableType ) FROM dual ) x)
I hadn't gotten to that in this circumstance as I had assumed this was really slow (it just looks too complex). Also I had problems getting my cursor declaration to compile.
(i.e. here's an example of such code. If you have insights on the
performance of this, I'd welcome them
http://groups.google.com/groups?q=oracle+cast+codetabletype&hl=en&lr=&ie=UTF-8&selm=94hk34%24lgm%241%40nnrp1.deja.com&rnum=1
)
TKPROF: Below is the tkprof output for the two queries. I've snipped the actual queries as they're quite long.
Some info:
1) "tmp_principal_tbl" is the global temporary table. It has primary
key index SYS_C00158740
2) "zmp_principal_tbl" (query 2) is a permanent version of that table
(cloned). It has primary key SYS_C00158739
Some observations:
The explain plans are identical to a point. Here's where they differ:
slow (with global temp table)
8149 FILTER 8149 NESTED LOOPS 8149 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX (UNIQUE SCAN) OF 'SYS_C00158740' (UNIQUE) 8149 NESTED LOOPS 8149 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACCESS_CONTROL_ENTRY' 0 INDEX (UNIQUE SCAN) OF 'SYS_C00158740' (UNIQUE) 8149 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK' (UNIQUE) fast (with permanent table): 8149 FILTER 8149 NESTED LOOPS 8149 INDEX GOAL: ANALYZED (FULL SCAN) OF 'SYS_C00158739' (UNIQUE) 8149 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK' (UNIQUE) 8149 NESTED LOOPS 57043 INDEX GOAL: ANALYZED (FULL SCAN) OF 'SYS_C00158739' (UNIQUE) 48894 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 57043 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK' (UNIQUE) 8149 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK' (UNIQUE) Here's the actual TKPROF output.
Trace file: ora_2181.trc
Sort options: fchela
count = number of times OCI procedure was executed cpu = cpu time in seconds executing elapsed = elapsed time in seconds executing disk = number of physical reads of buffers from disk query = number of buffers gotten for consistent read current = number of buffers gotten in current mode (usually for update) rows = number of rows processed by the fetch or execute call ********************************************************************************<long running query: with temporary table >
call count cpu elapsed disk query current rows
Parse 1 0.01 0.01 0 0 0 0 Execute 2 0.06 0.06 0 0 0 0 Fetch 25 464.69 468.47 2514453 4047978 65209 25
total 28 464.76 468.54 2514453 4047978 65209 25
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 299 (WUPE34B) (recursive depth: 1)
Rows Row Source Operation
------- --------------------------------------------------- 25 SORT ORDER BY
8150 NESTED LOOPS 8265 NESTED LOOPS 8266 TABLE ACCESS FULL POST 16529 TABLE ACCESS BY INDEX ROWID ELEMENT 16529 INDEX RANGE SCAN (object id 258369) 16413 TABLE ACCESS BY INDEX ROWID THREAD 16528 INDEX UNIQUE SCAN (object id 258333) 16298 TABLE ACCESS BY INDEX ROWID MSG_BOARD 16298 INDEX UNIQUE SCAN (object id 258248) 8149 FILTER 8149 NESTED LOOPS 8149 TABLE ACCESS FULL ACCESS_CONTROL_ENTRY 8149 INDEX UNIQUE SCAN (object id 259565) 8149 NESTED LOOPS 8149 TABLE ACCESS FULL ACCESS_CONTROL_ENTRY 0 INDEX UNIQUE SCAN (object id 259565) 8149 TABLE ACCESS BY INDEX ROWID ACCESS_CONTROL_ENTRY 8149 INDEX UNIQUE SCAN (object id 258146) 8149 TABLE ACCESS BY INDEX ROWID ACCESS_CONTROL_ENTRY 8149 INDEX UNIQUE SCAN (object id 258146) Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 25 SORT (ORDER BY) 8149 FILTER 8150 NESTED LOOPS 8150 NESTED LOOPS 8265 NESTED LOOPS 8266 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'POST' 16529 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ELEMENT' 16529 INDEX GOAL: ANALYZED (RANGE SCAN) OF 'ELEM_ELEMENT_TY_9_IDX' (NON-UNIQUE) 16413 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'THREAD' 16528 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'THRE_PK' (UNIQUE) 16298 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'MSG_BOARD' 16298 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'MSBO_PK' (UNIQUE) 8149 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK'(UNIQUE)
8149 FILTER 8149 NESTED LOOPS 8149 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX (UNIQUE SCAN) OF 'SYS_C00158740' (UNIQUE) 8149 NESTED LOOPS 8149 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'ACCESS_CONTROL_ENTRY' 0 INDEX (UNIQUE SCAN) OF 'SYS_C00158740' (UNIQUE) 8149 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK' (UNIQUE) ********************************************************************************<fastquery with permanent table /
call count cpu elapsed disk query current rows
Parse 1 0.01 0.01 0 0 0 0 Execute 2 0.06 0.07 0 0 0 0 Fetch 25 5.36 5.35 22729 387912 17 25
total 28 5.43 5.43 22729 387912 17 25
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 299 (WUPE34B) (recursive depth: 1)
Rows Row Source Operation
------- --------------------------------------------------- 25 SORT ORDER BY
8150 NESTED LOOPS 8265 NESTED LOOPS 8266 TABLE ACCESS FULL POST 16529 TABLE ACCESS BY INDEX ROWID ELEMENT 16529 INDEX RANGE SCAN (object id 258369) 16413 TABLE ACCESS BY INDEX ROWID THREAD 16528 INDEX UNIQUE SCAN (object id 258333) 16298 TABLE ACCESS BY INDEX ROWID MSG_BOARD 16298 INDEX UNIQUE SCAN (object id 258248) 8149 FILTER 8149 NESTED LOOPS 8149 INDEX FULL SCAN (object id 259563) 8149 TABLE ACCESS BY INDEX ROWID ACCESS_CONTROL_ENTRY 8149 INDEX UNIQUE SCAN (object id 258146) 8149 NESTED LOOPS 57043 INDEX FULL SCAN (object id 259563) 48894 TABLE ACCESS BY INDEX ROWID ACCESS_CONTROL_ENTRY 57043 INDEX UNIQUE SCAN (object id 258146) 8149 TABLE ACCESS BY INDEX ROWID ACCESS_CONTROL_ENTRY 8149 INDEX UNIQUE SCAN (object id 258146) 8149 TABLE ACCESS BY INDEX ROWID ACCESS_CONTROL_ENTRY 8149 INDEX UNIQUE SCAN (object id 258146) Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 25 SORT (ORDER BY) 8149 FILTER 8150 NESTED LOOPS 8150 NESTED LOOPS 8265 NESTED LOOPS 8266 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'POST' 16529 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ELEMENT' 16529 INDEX GOAL: ANALYZED (RANGE SCAN) OF 'ELEM_ELEMENT_TY_9_IDX' (NON-UNIQUE) 16413 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'THREAD' 16528 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'THRE_PK' (UNIQUE) 16298 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'MSG_BOARD' 16298 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'MSBO_PK' (UNIQUE) 8149 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK'(UNIQUE)
8149 FILTER 8149 NESTED LOOPS 8149 INDEX GOAL: ANALYZED (FULL SCAN) OF 'SYS_C00158739' (UNIQUE) 8149 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK' (UNIQUE) 8149 NESTED LOOPS 57043 INDEX GOAL: ANALYZED (FULL SCAN) OF 'SYS_C00158739' (UNIQUE) 48894 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 57043 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK' (UNIQUE) 8149 TABLE ACCESS GOAL: ANALYZED (BY INDEX ROWID) OF 'ACCESS_CONTROL_ENTRY' 8149 INDEX GOAL: ANALYZED (UNIQUE SCAN) OF 'ACCE_PK' (UNIQUE) ********************************************************************************Received on Fri Feb 06 2004 - 17:33:41 CST