L'ordre d'exécution des conditions dans SQL clause 'where'
J'ai un ensemble de conditions dans ma clause where comme
WHERE
d.attribute3 = 'abcd*'
AND x.STATUS != 'P'
AND x.STATUS != 'J'
AND x.STATUS != 'X'
AND x.STATUS != 'S'
AND x.STATUS != 'D'
AND CURRENT_TIMESTAMP - 1 < x.CREATION_TIMESTAMP
Laquelle de ces conditions sera exécuté en premier? Je suis de l'utilisation d'oracle.
Vais-je obtenir ces détails dans mon plan d'exécution?
(Je n'ai pas l'autorité de le faire dans la db ici, sinon j'aurais essayé)
Quel outil utilisez-vous pour exécuter SQL?
Peut-être le cœur de votre question manque. Pourquoi avez-vous de soins de quel ordre ils sont exécutés?
Peut-être le cœur de votre question manque. Pourquoi avez-vous de soins de quel ordre ils sont exécutés?
OriginalL'auteur sarego | 2008-12-04
Vous devez vous connecter pour publier un commentaire.
Êtes-vous sûr vous "n'ont pas le pouvoir" pour voir un plan d'exécution? Que penser de l'utilisation AUTOTRACE?
Comme vous pouvez le voir, qui donne beaucoup de détails sur la façon dont la requête sera exécutée. Il me dit que:
Ce décret d'application n'a rien à voir avec la façon dont les prédicats sont classés dans la clause where, comme on peut le montrer avec cette re-commandé requête:
OriginalL'auteur Tony Andrews
La base de données va décider de ce qu'afin d'exécuter les conditions.
Normalement (mais pas toujours), il va utiliser un indice d'abord, si possible.
Il les préfère quand ils sont mieux 🙂 Dans mon expérience c'est "normalement"
OriginalL'auteur Greg
Comme il a été dit, en regardant le plan d'exécution sera de vous donner quelques informations. Toutefois, à moins d'utiliser le plan de stabilité de la fonction, vous ne pouvez pas compter sur le plan d'exécution restant toujours le même.
Dans le cas de la requête que vous avez posté, il ne ressemble pas à l'ordre de l'évaluation va changer la logique de toute façon, donc je suppose que ce que vous pensez est l'efficacité. Il est assez probable que l'Oracle optimiseur de choisir un plan qui est efficace.
Il y a des trucs que vous pouvez faire pour encourager une commande particulière si vous voulez comparer les performances avec la base de la requête. Dire par exemple que vous vouliez le timestamp condition d'être exécuté en premier. Vous pouvez faire ceci:
Le "matérialiser" astuce devrait provoquer l'optimiseur d'exécuter la ligne de requête d'abord, puis de numériser l'ensemble des résultats pour les autres conditions.
Je ne suis pas vous conseiller de le faire comme une habitude. Dans la plupart des cas, le simple fait d'écrire la requête simple conduira à la meilleure exécution des plans.
OriginalL'auteur Dave Costa
À ajouter aux autres commentaires sur les plans d'exécution, en vertu de la cpu à base de modèle de calcul des coûts introduit dans 9i et utilisé par défaut dans+ 10g Oracle va également procéder à une évaluation dont l'évaluation du prédicat de la commande entraînera une réduction de coût de calcul, même si cela n'affecte pas l'accès à la table d'ordre et de méthode. Si l'exécution d'un prédicat avant qu'un autre se traduit par moins de prédicats de calcul est exécuté alors que optimisaton peut être appliquée.
Voir cet article pour plus de détails: http://www.oracle.com/technology/pub/articles/lewis_cbo.html
En outre, Oracle n'a pas encore d'exécuter des prédicats d'où la comparaison avec une vérification de la contrainte ou de la partition définitions indique qu'aucune ligne serait retourné de toute façon.
Complexes.
OriginalL'auteur David Aldridge
Enfin, la base de données relationnelle théorie dit que vous pouvez jamais dépendent de l'ordre d'exécution des clauses de requête, de manière à mieux de ne pas essayer. Comme d'autres l'ont dit, l'optimiseur basé sur les coûts essaie de choisir ce qu'il pense être le mieux, mais même la visualisation expliquer le plan de ne garantie de l'ordre réel qui est utilisé. Expliquer le plan vous indique juste que ce que le CBO recommande, mais c'est toujours pas à 100%.
Peut-être que si vous nous expliquer pourquoi vous essayez de faire cela, certains pourraient faire penser à un plan?
OriginalL'auteur Stew S
Question délicate. Juste en face au même dilemme. J'ai besoin de parler d'une fonction dans une requête. La fonction elle-même fait une autre requête, de sorte que vous comprendre comment il affecte les performances en général. Mais dans la plupart des cas que nous avons, la fonction ne serait pas appelé si souvent si le reste de conditions exécuté en premier.
Bien, pensé qu'il serait utile de poster ici un autre article pour le sujet.
La citation qui suit est copié à partir de Donald Burleson's site (http://www.dba-oracle.com/t_where_clause.htm) .
Oh, aussi la ordered_predicates clause a été documenté que d'aller après la clause where, mais comme tous les autres conseils de passe immédiatement après "SELECT", de sorte que l'article ne reflète pas toute l'expérience pratique de l'utilisation de l'indicateur. J'ai aussi trouvé une référence qui indique qu'il s'applique uniquement dans le cadre de la table unique de prédicats pour chaque table à accéder. Il a également été déprécié en 10g, et de soutien pour la 9.2 est terminée autour de 10 ans.
David, merci pour tant de "sage" et "mots-chasse" des commentaires. Certainement que vous avez fait une contribution significative dans le sujet de la discussion. Par la manière, le lien que vous avez fourni quelques années ne fonctionne pas aujourd'hui. Merci.
C'est l'article que je suis de critiquer, pas vous.
OriginalL'auteur Nikolay Antipov