2017-01-04 4 views
3

J'ai une question générale concernant l'utilisation des fonctions de chaîne et leur impact sur les performances. J'ai une table avec un index non-clustered sur l'ID de colonne. La colonne contient 20 caractères. Quand je lance:SQL à l'aide d'une fonction de chaîne sur la performance de colonne indexée

SELECT col1, col2 
FROM tbl 
WHERE ID = '00000000009123548754' 

Le résultat revient très vite. Mais quand je lance

SELECT col1, col2 
FROM tbl 
WHERE RIGHT(ID, 10) = '9123548754' 

Il faut un temps très long. Le plan d'exécution estimé pour la première requête a une recherche d'index, où pour la deuxième requête est un balayage d'index.

Je comprends que le Seek comme opposition à la numérisation est la raison pour laquelle on est plus rapide, mais pourquoi la fonction String Right() a un tel impact?

+0

S'il y a 20 chiffres, le second ne retournera aucune ligne. –

+3

Eh bien, RIGHT() ne peut pas fonctionner en conjonction avec les valeurs hachées sur lesquelles votre index est basé, donc il doit évaluer chaque valeur d'ID. Essayez et exécutez Database Engine Tuning Advisor par rapport à votre requête et voyez ce qu'elle propose. – uncoder

+0

Quelle version de la base de données utilisez-vous? – geofftnz

Répondre

2

La raison pour laquelle il y a une différence est que le RIGHT(ID,10) doit être résolu pour chaque ligne afin de le filtrer (d'où le balayage), alors que la clause ID = '00000000009123548754' peut être résolue en une simple recherche.

En termes techniques, votre première requête est sargable, tandis que la seconde ne l'est pas (en raison de la fonction).