Bonjour à tous,

J'ai testé deux requêtes qui donnent le même résultat et j'ai été pas mal surpris du résultat obtenu !

Voici les requêtes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
SELECT SCHEMA.CLIENT.LIEU AS LIEU
     , SCHEMA.CLIENT.IDENT AS ID
     , (SELECT SCHEMA.INFO.LABEL 
        FROM SCHEMA.INFO
        WHERE SCHEMA.INFO.IDENT = SCHEMA.CLIENT.IDENT
       ) AS LABEL
FROM SCHEMA.CLIENT
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
SELECT SCHEMA.CLIENT.LIEU AS LIEU
     , SCHEMA.CLIENT.IDENT AS ID
     , SCHEMA.INFO.LABEL AS LABEL
FROM SCHEMA.INFO
     LEFT JOIN SCHEMA.INFO ON SCHEMA.INFO.IDENT = SCHEMA.CLIENT.IDENT
Et voici le résultat :

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
Premier Query
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
 
Plan hash value: 4037814144
 
-----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                 |   496K|  6307K|   337   (3)| 00:00:05 |
|   1 |  TABLE ACCESS BY INDEX ROWID| INFO |     1 |    10 |     3   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | SYS_C0041052    |     1 |       |     2   (0)| 00:00:01 |
|   3 |  TABLE ACCESS FULL          | CLIENT   |   496K|  6307K|   337   (3)| 00:00:05 |
-----------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("INFO"."IDENT"=:B1)
 
 
Second Query
 
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------
 
Plan hash value: 1523841922
 
-------------------------------------------------------------------------------------------------
| Id  | Operation             | Name            | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                 |   496K|    10M|       |  1376   (2)| 00:00:17 |
|*  1 |  HASH JOIN RIGHT OUTER|                 |   496K|    10M|  6152K|  1376   (2)| 00:00:17 |
|   2 |   TABLE ACCESS FULL   | INFO |   286K|  2795K|       |   142   (3)| 00:00:02 |
|   3 |   TABLE ACCESS FULL   | CLIENT   |   496K|  6307K|       |   337   (3)| 00:00:05 |
-------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("INFO"."IDENT"(+)="CLIENT"."IDENT")
Je suis assez étonné car la première requête effectue une requête supplémentaire par enregistrement... La deuxième traite je suppose plus de données étant donné la jointure, mais de là à avoir un résultat 3x plus lent...
La deuxième requête me semblait plus propre..

Qu'en pensez-vous ?

Merci d'avance