Ordre d'évaluation de la clause SQL d'Oracle
dans Oracle, quels types de clause sont évalués en premier? Si j'avais ce qui suit (Faire Semblant .... représenter des expressions valides et des noms de relation), quel serait l'ordre d'évaluation?
SELECT ...
FROM .....
WHERE ........
GROUP BY ...........
HAVING .............
ORDER BY ................
je suis sous l'impression que la clause SELECT est évaluée en dernier, mais d'autres que je suis paumé.
5 réponses
la liste select ne peut pas toujours être évaluée en dernier parce que L'ordre Par peut utiliser des alias qui sont définis dans la liste select de sorte qu'ils doivent être exécutés après. Par exemple:
SELECT foo+bar foobar FROM table1 ORDER BY foobar
je dirais qu'en général, l'ordre d'exécution pourrait être quelque chose comme ceci:
- de
- où
- GROUP BY
- sélectionner
- ayant
- ORDER BY
Le GROUPE et PAR les clauses where peuvent être échangés sans changer le résultat, comme on a pu l'AVOIR et de l'ORDRE.
en réalité, les choses sont plus complexes parce que la base de données peut réorganiser l'exécution selon différents plans d'exécution. Tant que le résultat reste le même, peu importe dans quel ordre il est exécuté.
Notez aussi que si un index est choisi pour L'ordre par clause les lignes peuvent déjà être dans le bon ordre lorsqu'elles sont lues à partir du disque. Dans ce cas, L'ordre Par clause n'est pas du tout exécuté.
C'est à ça que servent les plans d'exécution. Mais, généralement, il ya seulement 1 façon de le faire. Je vais ignorer les optimisations pour le moment:
- à PARTIR de la table impliquée
- commence à balayer la table de, en gardant ceux qui passent où clause
- sélectionnez Colonnes non agrégées
- calculer les colonnes agrégées avec le groupe par
- conserver les résultats groupés qui passent ayant clause
- résultats d'ordre avec ORDRE PAR
les optimisations pourraient causer un "coup d'oeil" pour prendre de meilleures décisions (p. ex., ce serait une bonne idée de vérifier la clause où avant de scanner la table - un index peut être disponible).
je crois que la plupart des RDBM résolvent cela avec un pré-passage à travers un optimiseur qui va réécrire la requête pour profiter des index, supprimer les expressions redondantes, etc. Cette requête optimisée est ensuite utilisé pour construire le plan d'exécution. Il y a aussi le parallélisme qui pourrait changer les détails - mais les bases sont les mêmes.
Oracle Query Processing Order""
- de la clause
- WHERE clause
- GROUP BY clause
- avec clause
- SELECT clause
- ORDER BY clause
ci-dessous est L'ordre de traitement de requête SQL:
-
FROM
-
CONNECT BY
-
WHERE
-
GROUP BY
-
HAVING
-
SELECT
-
ORDER BY
Logique de Traitement de l'Ordre de la SELECT
déclaration
- de
- ON
- JOIN
- où
- GROUP BY
- avec CUBE ou avec ROLLUP
- ayant
- sélectionner
- DISTINCT
- ORDER BY
c'est l'ordre logique à utiliser dans l'écriture/(logiquement penser) la requête. La base de données peut optimiser la requête de différentes façons au cours de l'exécution réelle pour des raisons d'efficacité, aussi longtemps que les résultats retournés sont les mêmes que si elle a suivi cet ordre d'exécution.
Références