Est substr ou COMME plus rapide dans Oracle?
Serait
WHERE substr(my_field,1,6) = 'search'
ou
WHERE my_field LIKE 'search%'
être le plus rapide dans Oracle, ou y aurait-il pas de différence?
- Voir aussi stackoverflow.com/questions/8646623/...
Vous devez vous connecter pour publier un commentaire.
En supposant que le rendement maximal est le but, je voudrais idéalement choisir
SUBSTR(my_field,1,6)
et de créer une fonction d'index de base à l'appui de la requête.Comme l'autre,
SUBSTR(my_field,1,6)
ne serait pas en mesure d'utiliser un index normal surMY_FIELD
. La COMME version peut utiliser l'index, mais l'optimiseur estimations de cardinalité dans ce cas sont en général assez pauvres, de sorte qu'il est tout à fait probable, soit ne pas utiliser un index quand il serait utile d'utiliser un index lors de l'analyse d'une table serait préférable. L'indexation de l'expression réelle donnera à l'optimiseur de beaucoup plus d'informations pour travailler avec de sorte qu'il est beaucoup plus susceptibles de choisir l'index correctement. Quelqu'un de plus malin que je suis peut être en mesure de vous suggérer une façon d'utiliser les statistiques sur les colonnes virtuelles en 11g pour donner l'optimiseur de meilleures informations pour la COMME requête.Si 6 est une variable (c'est à dire parfois, vous souhaitez rechercher les 6 premiers caractères et parfois souhaitez rechercher un numéro différent), vous ne serez probablement pas en mesure de venir avec une fonction d'index de base à l'appui de cette requête. Dans ce cas, vous êtes probablement mieux avec les aléas de l'optimiseur de décisions avec la même formulation.
Des deux options proposées, certainement COMME. La sous-chaîne de la méthode devra être exécutée à l'encontre de toutes les lignes dans la table. En utilisant COMME va permettre l'utilisation de l'index.
Pour vérifier ma réponse, profil juste les résultats. Il devrait être clair comme le jour.
Si vous avez un index sur my_field, alors, COMME peut être plus rapide. Faire vos propres repères.
Si vous avez aucun indice qu'il n'y a pas de différence. Parce que oracle est en train de faire un full table scan et évalue l'expression pour chaque ligne.
Vous pouvez mettre un index sur la colonne pour accélérer les requêtes.
Cet indice est plus souple et accélère la requête en utilisant comme. Il va travailler pour tout comparer en commençant avec les personnages et d'avoir de l'espace réservé (%) à la fin. Oracle est en train de faire un index range scan pour trouver toutes les lignes correspondantes.
Cet index accélère la requête avec substr. Mais l'index est très spécial de comparer seulement les 6 premiers caractères.
Si vous effectuez une requête pour un morceau de débutant dans le milieu. La création d'une fonction de base de l'index de l'aide.
Il n'y a vraiment deux questions se posent ici:
Cela peut varier en fonction de la version, mais les deux sont assez facile à tester, et de cette façon vous êtes sûr que vous avez le meilleur de l'information pour votre version et vos données.
Exécuter des plans d'exécution pour les deux requêtes à l'aide de ...
et
Vous pouvez voir une différence sur le plan de l'exécution, en fonction de la présence d'index, etc., mais aussi de comparer les estimations de cardinalité avec le résultat que vous obtenez à partir de:
L'une des deux méthodes peuvent être beaucoup plus précis que les autres.
Si aucun des deux n'est très précis et cette requête est prévue pour un montant non négligeable de temps alors envisager l'utilisation d'échantillonnage dynamique à l'amélioration de l'estimation, car avec la mauvaise estimation de cardinalité l'optimiseur peut choisir un sous-optimale de la méthode d'accès de toute façon.
Autant que l'indice de l'utilisation, les deux méthodes peuvent utiliser un indice basé sur la méthode d'accès. Le prédicat LIKE est probablement plus l'indice sympathique et pourrait utiliser une analyse de plage ou une rapide analyse d'index. La méthode SUBSTR pouvez certainement utiliser la rapide analyse d'index, mais si l'optimiseur de prendre en considération un éventail d'analyse est le mieux testé sur votre propre version -- mon souvenir est qu'il ne est pas, mais qui est-à-dire que substr(my_column,1,n) ne sera pas reconnu comme un cas particulier, si pas maintenant, alors dans le futur?
Je voudrais profil à la fois. Mais je suppose que le "LIKE" serait beaucoup plus rapide, car il utilise le binaire de recherche sur l'index (si le champ est indexé). Si vous utilisez la méthode SUBSTR, vous allez vous retrouver avec un full table scan, Oracle a traiter ligne par ligne de la fonction.