Quelle est la différence entre la clause WITH
et la sous-requête?
1. WITH table_name as ( ... )
2. select *
from ( select curr from tableone t1
left join tabletwo t2
on (t1.empid = t2.empid)
) as temp_table
La clause WITH
concerne la factorisation de sous-requête , également appelée expressions de table communes ou CTE:
La clause WITH query_name vous permet d'attribuer un nom à un bloc de sous-requête. Vous pouvez ensuite référencer le bloc de sous-requête à plusieurs emplacements dans la requête en spécifiant nom_terrogation. Oracle Database optimise la requête en considérant le nom de la requête comme une vue intégrée ou comme une table temporaire.
Dans votre deuxième exemple, ce que vous avez appelé temp_table
est une vue intégrée et non une table temporaire.
Dans de nombreux cas, le choix du type d'utilisation dépend du style que vous préférez, et les CTE peuvent rendre le code plus lisible, en particulier avec plusieurs niveaux de sous-requêtes (les avis varient bien entendu). Si vous vous référez à la vue CTE/intégrée uniquement une fois, vous ne constaterez probablement aucune différence de performances, et l'optimiseur risque de se retrouver avec le même plan.
Ils sont particulièrement utiles lorsque vous devez utiliser la même sous-requête à plusieurs endroits, par exemple dans une union. Vous pouvez créer une vue en ligne dans un CTE afin que le code ne soit pas répété et qu'il permette à l'optimiseur de le matérialiser s'il pense que cela serait bénéfique.
Par exemple, cet exemple artificiel:
select curr from (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0
pourrait être restructuré pour:
with temp_table as (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0
La sous-requête ne doit plus être répétée. Plus le code répété est compliqué, plus l'utilisation d'un CTE est avantageuse du point de vue de la maintenance. Et plus la sous-requête est chère, plus vous bénéficiez d'avantages en termes de performances pourriez /, même si l'optimiseur est généralement très efficace pour comprendre ce que vous faites de toute façon.
Peut-être aucun. Oracle est capable de nombreuses transformations algébriques avant d’optimiser réellement la requête. Très probablement, les deux requêtes seront évaluées de la même manière (elles auront le même plan d'exécution).