Tout impact sur les performances d'Oracle pour l'utilisation COMME 'string' vs = 'string'?
Ce
SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE '%some_value%';
est plus lente que ce
SELECT * FROM SOME_TABLE WHERE SOME_FIELD = 'some_value';
mais que penser de cela?
SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE 'some_value';
Mon test indique les deuxième et troisième exemples sont exactement les mêmes. Si c'est vrai, ma question est, pourquoi "=" ?
Quels tests avez-vous fait?
1 - Exécution d'une instruction à l'encontre d'une grande table à l'aide de deux méthodes beaucoup de temps, en notant le temps d'exécution 2 - Regardé le plan d'expliquer
1 - Exécution d'une instruction à l'encontre d'une grande table à l'aide de deux méthodes beaucoup de temps, en notant le temps d'exécution 2 - Regardé le plan d'expliquer
OriginalL'auteur JosephStyons | 2008-09-25
Vous devez vous connecter pour publier un commentaire.
Il y a une nette différence lorsque vous utilisez des variables de liaison, qui vous devriez être en utilisant Oracle pour rien d'autre que l'entreposage de données ou d'autres données en vrac opérations.
Prenons le cas de:
Oracle ne peut pas savoir que la valeur de :b1 '%some_value%", ou "some_value", etc. jusqu'à ce que le temps d'exécution, et donc il va faire une estimation de la cardinalité du résultat basé sur des heuristiques et de venir avec un plan qui soit peut ou peut ne pas être approprié pour différentes valeurs de l' :b, comme les '%','%', 'A', etc.
Des problèmes similaires peuvent s'appliquer avec un prédicat d'égalité, mais la variété des cardinalités qui pourrait en résulter, est beaucoup plus facilement estimés sur la base des statistiques de colonne ou de la présence d'une contrainte unique, par exemple.
Donc, personnellement, je ne voudrais pas commencer à l'utiliser comme un remplacement pour =. L'optimiseur est assez facile de tromper parfois.
OriginalL'auteur David Aldridge
Découvrez la EXPLIQUER LE PLAN pour les deux. Ils génèrent le même plan d'exécution, donc à la base de données, ils sont la même chose.
Vous utilisez = pour tester l'égalité, pas la similitude. Si vous êtes le contrôle de la valeur de comparaison ainsi, il n'a pas beaucoup de différence. Si c'est envoyé par un utilisateur, puis de "pomme" et "apple% de" serait vous donner beaucoup de résultats différents.
Oui, si vous utilisez lier des variables, comme vous, l'optimiseur ne sais pas vraiment ce que vous allez passer. Donc, on ne peut pas optimiser pour avoir une wild card, d'un seul côté. (Bien sûr, Oracle a peut-être travaillé autour de cette caractéristique).
OriginalL'auteur Wayne
Une meilleure question: Si c'est vrai, pourquoi utiliser des "j'AIME" pour tester l'égalité? Vous arrivez à économiser de frapper la touche maj enfoncée, et tout le monde qui lit le script arrive à être confus.
OriginalL'auteur James Curran
Avez-vous essayé? Le test est le seul moyen sûr de savoir.
Comme une part, aucune de ces déclarations sont certains de retourner les mêmes lignes. Essayer:
En termes de clarté et pour éviter des bugs, il est préférable de ne jamais utiliser COMME si vous en avez besoin du générique de la fonctionnalité. (Évidemment, quand on fait des requêtes ad-hoc, c'est probablement très bien.)
LIKE '%some_value%'
retourne tous les trois enregistrements,= 'some_value'
retourne uniquement le deuxième enregistrement,LIKE 'some_value'
retourne la première et la troisième enregistrements.OriginalL'auteur Jon Ericson
LIKE '%QUEL% " aura pour objectif de faire une analyse d'index.
Si il n'y est pas pour cent, alors qu'il agit comme un égal.
Si le % est sur une extrémité, l'indice peut être une analyse de plage.
Je ne suis pas sûr de savoir comment l'optimiseur traite les champs liés.
OriginalL'auteur Greg Ogle
like
est formellement le même si vous n'avez pas de personnages comme$%
etc ... donc c'est pas une grande surprise de constater qu'il a le même coût.Je trouve David Aldridge réponse intéressante en tant que votre demande doit être à l'aide de variables de liaison. Avec un
like '%foobar'
vous ne pouvez pas faire usage de la commande dans l'index. Si la requête est pré-compilé, Il va conduire à plus d'un index ou une table des Scans complets.En outre, je trouve ça dangereux car il peut conduire à des Injections SQL et les bugs étranges ( par exemple, si un utilisateur appelé john, un pirate peut créer un utilisateur nommé
'joh$'
et essayez de vous)pourquoi prendre le risque?
'='
est plus clair et a aucun de ces problèmes.OriginalL'auteur borjab
1) % et = sont destinés à être utilisés dans des scénarios différents.
Même si nous pouvons, de recherche avec la valeur exacte de la clause like et obtenir le résultat souhaité, on doit toujours être à l'aide de = dans tous ces scénarios. Par conséquent, chaque fois que nous avons exacte de la valeur à rechercher nous doit être toujours à l'aide de =.
2) la performance de comme et = si aucune % est prévue dans la clause de recherche:
Dans tous ces cas, l'optimiseur de requête convertit automatiquement comme cluase de =. Et cela peut être évident à partir de plan de requête (voir captures d'écran ci-jointe) . Par conséquent, la performance doit être exactement le même dans ce cas. Grâce à l'optimiseur de requête!
Je suis en fournissant les captures d'écran de l'exécution des plans à la fois les requêtes c'est à dire de la requête avec la clause like mais sans % et de la requête avec la clause like et avec %.
OriginalL'auteur user3260035