Question

Dans Oracle, quels types clause évalués de la première? Si je devais les éléments suivants (faire semblant .... représenter des expressions valides et les noms de relation), qu'est-ce que l'ordre d'évaluation soit?

SELECT   ...
FROM     .....
WHERE    ........
GROUP BY ...........
HAVING   .............
ORDER BY ................

Je suis sous l'impression que la clause SELECT est évaluée dernière, mais à part que je suis désemparés.

Était-ce utile?

La solution

La liste de sélection ne peut pas toujours être évalué en dernier parce que l'ORDER BY peut utiliser des alias qui sont définis dans la liste de sélection afin qu'ils doivent être exécutés par la suite. 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:

  • WHERE
  • GROUP BY
  • SELECT
  • HAVING
  • ORDER BY

GROUP BY et les clauses WHERE pourraient être permutés sans changer le résultat, tout comme la HAVING et ORDER BY.

En réalité, les choses sont plus complexes, car la base de données peut réorganiser l'exécution en fonction des différents plans d'exécution. Tant que le résultat reste le même, il n'a pas d'importance dans quel ordre il est exécuté.

Notez également que si un indice est choisi pour la clause ORDER BY les lignes pourraient être déjà dans le bon ordre quand ils sont lus à partir du disque. Dans ce cas, la clause ORDER BY est pas vraiment exécuté du tout.

Autres conseils

C'est ce que les plans d'exécution sont pour. Mais, en général, il n'y a que 1 façon de le faire. Je vais ignorer les optimisations pour le moment:

  • pour obtenir la table impliquée
  • Démarrer la numérisation de la table dans FROM, en gardant ceux qui passent la clause WHERE
  • SELECT colonnes non agrégées
  • Calculer agrégées avec des colonnes GROUP BY
  • Gardez les résultats regroupés qui passent HAVING
  • Résultats de la commande avec ORDER BY

Optimisations pourrait causer des « jeter un oeil » pour prendre de meilleures décisions (. Par exemple, ce serait une bonne idée de vérifier la clause WHERE avant de numériser la table - un index peut être disponible).

Je crois que la plupart des SGBDR résoudre ce avec un pré-passer par un optimiseur qui sera essentiellement réécrire la requête pour tirer parti des index, suppression d'expressions redondantes, etc. Cette requête optimisée est ensuite utilisée pour construire effectivement le plan d'exécution. Il y a aussi le parallélisme qui pourrait changer les spécificités -., Mais les bases sont les mêmes

Commander Oracle traitement des requêtes

  • clause FROM
  • clause WHERE
  • clause GROUP BY
  • HAVING
  • clause SELECT
  • clause ORDER BY

Ci-dessous de requêtes SQL Traitement des commandes:

  1. FROM
  2. CONNECT BY
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. SELECT
  7. ORDER BY

Traitement logique Ordre de l'instruction SELECT

  1. ON
  2. JOIN
  3. WHERE
  4. GROUP BY
  5. AVEC CUBE ou ROLLUP AVEC
  6. HAVING
  7. SELECT
  8. DISTINCT
  9. ORDER BY

est logique afin d'être utilisé par écrit / (pensée logique à) la requête. La base de données peut optimiser la requête de différentes manières lors de l'exécution réelle pour un souci d'efficacité, tant que les résultats retournés sont les mêmes que si elle a suivi cet ordre d'exécution.

Références

Microsoft T-SQL
Oracle Blog

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top