Les performances de SQL comparaison à l'aide de substring vs comme avec des caractères génériques
Je suis en train de travailler sur une condition de jointure entre 2 tables où l'une des colonnes de correspondance est une concaténation de valeurs. J'ai besoin de rejoindre la columnA de tableA pour les 2 premiers caractères de colonneb de la tableB.
J'ai développé 2 différents états de gérer cela et j'ai essayé d'analyser la performance de chaque méthode.
Méthode 1:
ON tB.columnB like tA.columnA || '%'
Méthode 2:
ON substr(tB.columnB,1,2) = tA.columnA
Le plan d'exécution de requête a beaucoup moins d'étapes à l'aide de la Méthode 1 par rapport à la Méthode 2, cependant, il ressemble à la Méthode 2 s'exécute beaucoup plus rapidement. Aussi, le plan d'exécution montre un recommandé indice pour la Méthode 2 qui pourrait améliorer ses performances.
Je suis en cours d'exécution sur une IBM iSeries, serait intéressé par les réponses dans un sens général, pour en savoir plus sur l'optimisation des requêtes sql.
T-il un sens que la Méthode 2 ne s'exécutent plus rapidement?
Ce DONC, la question est similaire, mais il semble que personne n'a fourni aucune réponse concrète à la différence de performances de ces approches: T-SQL comparaison de la vitesse entre la GAUCHE() vs COMME opérateur.
PS: la conception de La table qui nécessite ce type de jointure n'est pas quelque chose que je peux avoir changé à ce moment. Je me rends compte avoir le champs séparés qui détiennent les différents types de données serait préférable.
C'est pour une jointure interne. Serait-type de jointure faire une différence?
Eh bien, c'est probablement perdre un match à deviner ce qui se passe dans un optimiseur de requête. Mais oui, dans ce cas, si c'est une JOINTURE INTERNE de la Méthode 1 requiert que toutes tA pour être lu en méthode 2 seulement besoin de lire la tuberculose. Selon le nombre de lignes, qui pourraient être importants et affecter l'exécution du plan.
OriginalL'auteur Swoop | 2011-09-15
Vous devez vous connecter pour publier un commentaire.
J'ai couru à la suite dans le SQL Conseiller dans IBM Data Studio sur l'une des tables de ma DB2 LUW 10.1 de la base de données:
et
Ils avaient tous les deux exactement le même chemin d'accès en utilisant le même indice, la même estime IO coût et la même estimation de cardinalité, la seule différence étant le total estimé coût de l'UC pour la même 178,343.75 alors que le SUBSTR était 197,518.48 (~10% de différence).
Le total cumulatif des coûts pour les deux sont le même, si cette différence est négligeable par le conseiller.
OriginalL'auteur earthiverse
Oui, la Méthode 2 est plus rapide. COMME n'est pas aussi efficace d'une fonction.
Pour comparer les performances des différentes techniques, essayez d'utiliser Visual Expliquer. Vous trouverez qu'il est enterré dans System i Navigator. En vertu de votre connexion au système, développez bases de données, puis cliquez sur onyour RDB nom. Dans le bas du volet de droite, vous pouvez cliquer sur l'option pour Exécuter un Script SQL. Entrez dans votre instruction SELECT et choisissez l'option de menu pour Visual les Expliquer ou de les Exécuter et de les Expliquer. Visual expliquer décompose le plan d'exécution de votre déclaration et vous montrer le coût pour chaque partie comme estimées sur vos tables avec les indices disponibles.
COMME peut être très efficace si le générique est à la fin de la comparaison de chaîne et le moteur comprend à l'utilisation d'un index disponible pour la comparaison.
vous dites que, dans certaines circonstances, que l'optimiseur va comprendre un générique à la fin pour être équivalent à GAUCHE()? Pouvez-vous donner un exemple où il serait plus efficace?
En fait, il me surprendrait si aucun principaux moteur SQL pas comprendre que les non-caractères génériques au début d'un comparateur peut utiliser une recherche indexée si la COMME la colonne a été indexé. C'est une jolie optimisation de base. Je pourrait normalement s'attendre à être optimisé et la GAUCHE() pour être manquée par l'optimiseur (je ne sais pas si les optimiseurs en général de comprendre les effets de la non-SQL fonctions dans les requêtes).
OriginalL'auteur WarrenT
Vous pouvez réellement exécuter avec des exemples réels dans votre base de données.
AIME, c'est toujours mieux à ma course.
OriginalL'auteur SIDU
J'ai trouvé cette référence dans un redbook IBM liées à des performances SQL. Il sonne comme le SUBSTR fonction scalaire peut être manipulé de manière optimisée par un iSeries.
http://publib-b.boulder.ibm.com/abstracts/sg246654.html?Open
OriginalL'auteur Swoop