T-SQL comparaison de la vitesse entre la GAUCHE() vs COMME opérateur
Je suis la création de résultat de pagination basée sur la première lettre de certains nvarchar
colonne et de ne pas l'habitude, qui, généralement, les pages sur le nombre de résultats.
Et je ne suis pas face à un défi que de filtrer les résultats à l'aide LIKE
de l'opérateur ou de l'égalité (=
) de l'opérateur.
select *
from table
where name like @firstletter + '%'
vs
select *
from table
where left(name, 1) = @firstletter
J'ai essayé de chercher sur le net pour la comparaison de la vitesse entre les deux, mais il est difficile de trouver des résultats, puisque la plupart des résultats de la recherche sont liées à LEFT JOINs
et pas LEFT
fonction.
Avez-vous regardé les plans de requête pour les deux? Avez-vous gérer votre propre indice de référence?
Non, je n'ai pas. J'ai pensé que je n'étais pas le premier à me poser cette question, j'ai donc bien que quelqu'un d'autre pourrait l'ai testé déjà. Parce que de GAUCHE, la plupart ayant trait à joint que je n'arrive pas à trouver ces données. D'où la question si quelqu'un a le lien quelque part. Je soupçonne que la GAUCHE devrait être beaucoup plus rapide
Le premier (à l'aide de
est correcte. Lors de l'utilisation de n'importe quelle fonction comme de GAUCHE, sous-CHAÎNE, etc, le serveur ne peut pas utiliser les index.
Merci. Ne le savais pas.
Non, je n'ai pas. J'ai pensé que je n'étais pas le premier à me poser cette question, j'ai donc bien que quelqu'un d'autre pourrait l'ai testé déjà. Parce que de GAUCHE, la plupart ayant trait à joint que je n'arrive pas à trouver ces données. D'où la question si quelqu'un a le lien quelque part. Je soupçonne que la GAUCHE devrait être beaucoup plus rapide
Le premier (à l'aide de
LIKE
) a la possibilité d'utiliser un index sur name
, tandis que la seconde (fonction à l'encontre de la valeur de la colonne) ne fonctionne pas.est correcte. Lors de l'utilisation de n'importe quelle fonction comme de GAUCHE, sous-CHAÎNE, etc, le serveur ne peut pas utiliser les index.
Merci. Ne le savais pas.
OriginalL'auteur Robert Koritnik | 2010-10-31
Vous devez vous connecter pour publier un commentaire.
Votre meilleur pari serait de mesurer le rendement réel des données de production plutôt que d'essayer de deviner (ou demandez-nous). C'est parce que les performances peuvent parfois dépendre sur les données que vous êtes en traitement, bien que dans ce cas, il semble peu probable (mais je n'ai pas savoir que, c'est pourquoi vous devriez vérifier).
Si c'est une requête que vous allez faire beaucoup, vous devriez envisager un autre (indexé) de la colonne qui contient les mises en minuscule première lettre de
name
et l'ont mis par une insertion/mise à jour le déclencheur.Cela, au prix d'une légère augmentation de capacité de stockage, de faire cette requête aveuglément rapide:
C'est parce que la plupart de la base de données sont en lecture beaucoup plus souvent que d'écrire, et cela permettra d'amortir le coût de calcul (fait uniquement pour l'écrit) à travers toutes les lectures.
Il introduit de données redondantes, mais ça va le faire pour des performances aussi longtemps que vous le comprendre (et d'atténuer, comme dans cette suggestion) les conséquences et besoin la performance.
Un index sur la colonne nom peut être utilisé pour
name like 'a%'
, pas besoin de la colonne calculée.Andomar, un bon point qui ne serait pas gérer la casse de la nature, même si je suis conscient que certains SGBD permettent un calcul d'index sur la colonne (de sorte qu'il serait automatiquement mis en minuscule).
S'il est sensible à la casse ou pas ne dépend pas de la colonne de classement dans SQL Server. La question est balisé TSQL.
OriginalL'auteur paxdiablo
"Gauche" vs "j'Aime" -- on devrait toujours utiliser des "j'Aime" lorsque cela est possible, où les index sont mis en œuvre parce que "j'Aime" n'est pas une fonction et peut donc utiliser tous les indices que vous pouvez avoir sur les données.
"De gauche", d'autre part, est la fonction, et donc ne peuvent pas utiliser les index. Cette page web décrit l'utilisation des différences avec quelques exemples. Ce que cela signifie, c'est que SQL server a évaluer la fonction, pour chaque enregistrement, qui est retourné.
"Substring" et d'autres fonctions similaires sont également coupables.
OriginalL'auteur Thrawn Wannabe
J'ai eu une question similaire, et a mené des tests sur les deux. Voici mon code.
Retourné 1434 lignes en 1 min 51 secondes.
vs
Retourné 1434 lignes en 1 min 27 secondes
Mes données est plus rapide avec la gauche 5. Comme une part de ma requête globale ne frapper quelques indices.
OriginalL'auteur PCSgtL
Je suggère toujours à utiliser comme opérateur lors de la colonne de recherche contient des index. J'ai testé la requête ci-dessus dans mon environnement de production avec select count(nom_colonne) from table_name where gauche(nom_colonne,3)= " AAA "OU vers la gauche(nom_colonne,3)=" ABA " OU ... jusqu'à 9 OU clauses. Mon compte affiche 7301477 enregistrements avec 4 secondes à gauche et 1 seconde comme je l'ai.e où column_name comme " AAA%' OU Column_Name comme " ABA%' ou ... jusqu'à 9 comme les clauses.
L'appel d'une fonction dans la clause where n'est pas une bonne pratique. Reportez-vous http://blog.sqlauthority.com/2013/03/12/sql-server-avoid-using-function-in-where-clause-scan-to-seek/
OriginalL'auteur Kannan.C