optimisation de requête sql
Bonjour,
J'ai une base de données 10.2.0.4.0, j'ai actuellement une requête qui consomme beaucoup de cpu time, je voudrais l'optimiser:
voici ci-dessous la requête:
Code:
1 2 3 4 5
| SELECT DISTINCT A.QUEUENAME
FROM SYSADM.PSAPMSGPUBHDR A, SYSADM.PSQUEUEDEFN B
WHERE PUBSTATUS in (1,2)
AND A.QUEUENAME = B.QUEUENAME
AND B.QUEUESTATUS <> 2; |
ci-dessous le plan d'execution:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| -------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 940 (100)| |
| 1 | HASH UNIQUE | | 8 | 328 | 940 (7)| 00:00:12 |
|* 2 | HASH JOIN | | 672K| 26M| 899 (2)| 00:00:11 |
|* 3 | TABLE ACCESS FULL | PSQUEUEDEFN | 73 | 1387 | 5 (0)| 00:00:01 |
|* 4 | INDEX FAST FULL SCAN| PSDPSAPMSGPUBHDR | 672K| 14M| 889 (2)| 00:00:11 |
-------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1
3 - SEL$1 / B@SEL$1
4 - SEL$1 / A@SEL$1
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('10.2.0.4')
OPT_PARAM('_optimizer_cost_based_transformation' 'off')
OUTLINE_LEAF(@"SEL$1")
FULL(@"SEL$1" "B"@"SEL$1")
INDEX_FFS(@"SEL$1" "A"@"SEL$1" ("PSAPMSGPUBHDR"."PUBSTATUS"
"PSAPMSGPUBHDR"."QUEUENAME"))
LEADING(@"SEL$1" "B"@"SEL$1" "A"@"SEL$1")
USE_HASH(@"SEL$1" "A"@"SEL$1")
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("A"."QUEUENAME"="B"."QUEUENAME")
3 - filter("B"."QUEUESTATUS"<>2)
4 - filter(("PUBSTATUS"=1 OR "PUBSTATUS"=2))
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "A"."QUEUENAME"[VARCHAR2,120]
2 - (#keys=1) "A"."QUEUENAME"[VARCHAR2,120]
3 - "B"."QUEUENAME"[VARCHAR2,120]
4 - "A"."QUEUENAME"[VARCHAR2,120] |
ci-dessous le nombre de ligne de chaque table , les index etc ...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS LAST_ANA
------------------------------ ---------- ---------- ------------ --------
PSAPMSGPUBHDR 672909 20307 0 09/11/10
INDEX_NAME TABLE_NAME COLUMN_NAME COLUMN_POSITION
--------------- --------------- --------------- ---------------
PS_PSQUEUEDEFN PSQUEUEDEFN QUEUENAME 1
INDEX_NAME TABLE_NAME COLUMN_NAME COLUMN_POSITION
-------------------- --------------- -------------------- ---------------
PS_PSAPMSGPUBHDR PSAPMSGPUBHDR IBTRANSACTIONID 1
PSAPSAPMSGPUBHDR PSAPMSGPUBHDR QUEUENAME 1
PSBPSAPMSGPUBHDR PSAPMSGPUBHDR LASTUPDDTTM 1
PSDPSAPMSGPUBHDR PSAPMSGPUBHDR PUBSTATUS 1
PSCPSAPMSGPUBHDR PSAPMSGPUBHDR PUBSTATUS 1
PSDPSAPMSGPUBHDR PSAPMSGPUBHDR QUEUENAME 2
PSCPSAPMSGPUBHDR PSAPMSGPUBHDR PUBLISHTIMESTAMP 2 |
Quelqu'un peut me donner des idées sur ce qui ne va pas ou comment puis-je le réécrire ?
Merci.