select value
from persons p join persons2 p2
on left(p.lastname,1) = left(p2.lastname,1)
Serveur SQL. Existe-t-il un moyen de rendre ce SARGable / plus rapide? Je ne peux pas créer de colonnes sur la table des personnes, mais je peux créer des colonnes sur les personnes2.
sql-server
lastchancexi
la source
la source
Réponses:
Créez une vue sur les tables avec une colonne calculée persistante définie comme la
LEFT(lastname, 1)
de chaque table, puis comparez les valeurs des colonnes persistantes calculées.Voici un banc d'essai montrant comment procéder:
Ici, nous allons insérer quelques exemples de données:
Voici la
SELECT
requête:Et les résultats:
Le plan d'exécution, avec seulement deux lignes par table (certes pas beaucoup de lignes!)
la source
Si la
lastname
colonne est indexée dans au moins une des tables, vous pouvez également utiliserLIKE
Le plan pour cela peut avoir une recherche sur la table spécifiée à gauche de similaire.
c.-à
ON p.lastname LIKE LEFT(p2.lastname, 1) + '%'
-d. ne serait pas en mesure de faire usage de l'indexpersons2
utilisé ci-dessus mais pourrait en rechercher unpersons
.La suggestion dans l'autre réponse d'indexer une colonne calculée des deux côtés est cependant plus flexible. En ce qui concerne un plan de boucles imbriquées, chaque table peut être à l'intérieur et cela permettrait également une fusion de plusieurs à plusieurs sans nécessiter de tri.
la source
Il se trouve que j'ai une table avec 3 423 lignes et 195 valeurs distinctes
Name
. Je vais appeler cette tableP
(personne) et la dupliquer pour créerP2
(personne2). Il existe une clé primaire unique en cluster sur une colonne d'ID entier. J'utilise Microsoft SQL Server 2016 (KB3194716) Developer Edition (64 bits) sur Windows 10 Pro 6.3 avec 32 Go de RAM.Avec la requête de base
J'obtiens 1,5M de lignes retournées en 3200-3300ms (à partir des statistiques io).
En réécrivant ainsi -
écoulé se réduit à 50-60 ms et le plan est le suivant:
Moins de lignes sont renvoyées (3 423) en raison de l'algorithme de correspondance. Le même nombre de plans et de lignes est obtenu en remplaçant la requête de base par
select distinct
.En créant une colonne indexée et calculée
Le temps écoulé tombe à 45-50 ms.
la source