Bonjour à tous,

J'aurai besoin de quelques pistes pour améliorer une requête.

Je vous explique rapidement la situation : nous traitons un certain nombre d'événements, ces événements passent par différents statuts au cours du traitement et on conserve un historique des ces statuts.
Pour du reporting, on voudrait récupérer connaître le nombre de passage par chacun des status pour chaque jour MAIS un événement pouvant être traité sur plusieurs jours on souhaite que les status de chaque événement soient comptés sur le dernier jour de traitement (avec la requête ça sera peut-être plus clair).

Je ne suis pas totalement maître de la structure de la table (statuts directement en VARCHAR2, etc.) et je ne peux pas trop casser l'existant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE "SPV_LOG_BOOK"
  (
    "ID" NUMBER NOT NULL ENABLE,
    "DATE_TIME" TIMESTAMP (6) NOT NULL ENABLE,
    "EVENT_ID"  NUMBER NOT NULL ENABLE,
    "STATUS"    VARCHAR2(40 CHAR) NOT NULL ENABLE,
    CONSTRAINT "PK_SPV_LOG_BOOK" PRIMARY KEY ("ID") ENABLE
  );
CREATE UNIQUE INDEX "PK_SPV_LOG_BOOK" ON "SPV_LOG_BOOK" ("ID");
CREATE INDEX "INDEX_SPVLB_DATETIME" ON "SPV_LOG_BOOK" ("DATE_TIME" DESC);
CREATE INDEX "INDEX_SPVLB_EVENTID" ON "SPV_LOG_BOOK" ("EVENT_ID" DESC);
La requête basique avec son plan d'exécution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
SELECT h.DATE_TIME, s.STATUS, COUNT(*)
FROM SPV_LOG_BOOK s
INNER JOIN (
  SELECT EVENT_ID, TRUNC(MAX(DATE_TIME)) As DATE_TIME
  FROM SPV_LOG_BOOK
  GROUP BY EVENT_ID
) h ON h.EVENT_ID = s.EVENT_ID
GROUP BY h.DATE_TIME, s.STATUS;
 
----------------------------------------------------------------------------------------------                                                                                                                                                                                                               
| Id  | Operation             | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |                                                                                                                                                                                                               
----------------------------------------------------------------------------------------------                                                                                                                                                                                                               
|   0 | SELECT STATEMENT      |              |   247K|    17M|       |  4975   (1)| 00:01:00 |                                                                                                                                                                                                               
|   1 |  HASH GROUP BY        |              |   247K|    17M|       |  4975   (1)| 00:01:00 |                                                                                                                                                                                                               
|*  2 |   HASH JOIN           |              |   247K|    17M|  1984K|  4966   (1)| 00:01:00 |                                                                                                                                                                                                               
|   3 |    VIEW               |              | 65523 |  1215K|       |  2402   (1)| 00:00:29 |                                                                                                                                                                                                               
|   4 |     HASH GROUP BY     |              | 65523 |  1151K|  6816K|  2402   (1)| 00:00:29 |                                                                                                                                                                                                               
|   5 |      TABLE ACCESS FULL| SPV_LOG_BOOK |   247K|  4350K|       |  1657   (1)| 00:00:20 |                                                                                                                                                                                                               
|   6 |    TABLE ACCESS FULL  | SPV_LOG_BOOK |   247K|    13M|       |  1658   (1)| 00:00:20 |                                                                                                                                                                                                               
----------------------------------------------------------------------------------------------                                                                                                                                                                                                               
 
Predicate Information (identified by operation id):                                                                                                                                                                                                                                                          
---------------------------------------------------                                                                                                                                                                                                                                                          
 
   2 - access("H"."EVENT_ID"="S"."EVENT_ID" AND                                                                                                                                                                                                                                                              
              SYS_OP_DESCEND("H"."EVENT_ID")=SYS_OP_DESCEND("S"."EVENT_ID"))
Un petit jeu de données pour les personnes motivées :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450953,to_timestamp('17/06/12 07:27:13,680000000','DD/MM/RR HH24:MI:SS,FF'),474393,'O');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450954,to_timestamp('18/06/12 07:27:15,639000000','DD/MM/RR HH24:MI:SS,FF'),474393,'R');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450955,to_timestamp('18/06/12 07:27:15,643000000','DD/MM/RR HH24:MI:SS,FF'),474393,'F');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450959,to_timestamp('18/06/12 07:35:52,704000000','DD/MM/RR HH24:MI:SS,FF'),474395,'O');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450960,to_timestamp('18/06/12 07:35:53,090000000','DD/MM/RR HH24:MI:SS,FF'),474395,'R');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450961,to_timestamp('18/06/12 07:35:53,093000000','DD/MM/RR HH24:MI:SS,FF'),474395,'F');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450952,to_timestamp('18/06/12 07:19:22,882000000','DD/MM/RR HH24:MI:SS,FF'),474392,'O');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450956,to_timestamp('18/06/12 07:31:49,548000000','DD/MM/RR HH24:MI:SS,FF'),474394,'O');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450957,to_timestamp('18/06/12 07:31:50,676000000','DD/MM/RR HH24:MI:SS,FF'),474394,'R');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450958,to_timestamp('18/06/12 07:31:50,681000000','DD/MM/RR HH24:MI:SS,FF'),474394,'F');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450962,to_timestamp('18/06/12 07:35:53,515000000','DD/MM/RR HH24:MI:SS,FF'),474396,'O');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450963,to_timestamp('18/06/12 07:35:54,236000000','DD/MM/RR HH24:MI:SS,FF'),474396,'R');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450964,to_timestamp('18/06/12 07:35:54,240000000','DD/MM/RR HH24:MI:SS,FF'),474396,'F');
Insert into SPV_LOG_BOOK (ID,DATE_TIME,EVENT_ID,STATUS) values (1450965,to_timestamp('18/06/12 07:54:25,353000000','DD/MM/RR HH24:MI:SS,FF'),474397,'O');
Quelles peuvent être les bonnes idées pour améliorer cette requête ?

Merci par avance pour vos suggestions.

Cordialement,
FSiebert