J'ai posté une question ici , mais comme aucune réponse, j'ai donc essayé de cibler ce qui ralentissait ma requête et une question m'est venue à l'esprit. Lequel est le plus rapide et le plus efficace? GAUCHE ou SUBSTRING?
SQL Server est une base de données. Vous ne posez pas de questions sur la fonction de traitement de chaîne la plus rapide. Vous posez les questions "qui peut utiliser un index?" et 'ai-je l'index requis?' Tout est question d’accès aux données, car les disques sont minuscules, pas de décalage des registres de la CPU.
Alors, Qui peut utiliser un index? (lequel est sargable ?). En théorie, LEFT
pourrait utiliser un index, mais en pratique, il ne le fait généralement pas. SUBSTRING
ne peut pas. Au lieu de SUBSTRING
, utilisez Full Text .
Concevez votre modèle de données pour tirer parti des expressions sargables, indexez en conséquence. C'est tout ce qu'il y a à faire, il n'y a pas de solution miracle. Évitez les scans.
Il n'y a aucune différence entre left
et substring
car left
est traduit en substring
dans le plan d'exécution.
Par exemple:
select substring(col, 1, 2),
left(col, 3)
from YourTable
ressemblera à ceci dans le plan d'exécution
<DefinedValue>
<ColumnReference Column="Expr1004" />
<ScalarOperator ScalarString="substring([col],(1),(2))">
<Intrinsic FunctionName="substring">
<ScalarOperator>
<Identifier>
<ColumnReference Column="col" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(1)" />
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(2)" />
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</DefinedValue>
<DefinedValue>
<ColumnReference Column="Expr1005" />
<ScalarOperator ScalarString="substring([col],(1),(3))">
<Intrinsic FunctionName="substring">
<ScalarOperator>
<Identifier>
<ColumnReference Column="col" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(1)" />
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(3)" />
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</DefinedValue>
Ceci est un bon article qui compare les performances entre SUBSTRING, LIKE, CHARINDEX et LEFT/RIGHT si quelqu'un est intéressé.
Selon les résultats, sur les colonnes non indexées, les positions LEFT/RIGHT sont systématiquement plus rapides que SUBSTRING.
Lorsque vous utilisez des fonctions sur les prédicats, votre moteur sera obligé d'utiliser l'opération de balayage par rapport à l'opération de recherche. Théoriquement, Gauche semble être favorable à l'utilisation judicieuse de l'index. Cependant, votre moteur ne connaît toujours pas la sortie de la fonction Left () tant qu'elle n'est pas exécutée. Donc, c'est pareil pour Substring () aussi.
Si vous voulez vraiment optimiser les performances de la requête, vous pouvez remplacer l'expression Left () par, COMMEexpression. Assurez-vous que le caractère générique% à la fin. Cette expression utilisera Index Seek (si vous avez un index approprié sur la colonne).
Exemple,
Left (MyColumn, 2) = 'AB' >> MyColumn LIKE 'AB%'
En fait, l'opérateur LIKE (avec le caractère générique% à la fin), a finalement été converti en prédicats de recherche logique par moteur. Ainsi, l’expression LIKE ci-dessus sera réécrite par le moteur comme suit:
MyColumn LIKE 'AB%' >> MyColumn> = 'AB' et MyColumn <'AC'
Pour Substring (), vous n’avez pas de meilleur remplacement et vous devez penser à d’autres alternatives, comme Full Text.
Table comme ça
Id_num Fname Minit Lname ids
1 Karin F Josephs 3
2 Pirkko O Koskitalo 56
3 Karin F Josephs 16
4 Pirkko O Koskitalo 96
1 Karin F Josephs 3
2 Pirkko O Koskitalo 56
Sous-chaîne:
Using Substring give the initial position values and End position values.
Par exemple:
select SUBSTRING(Fname,2,5) from new_employees
(No column name)
arin
irkko
arin
irkko
arin
irkko
La gauche:
using Substring give only how many char you want from LEFT Side.
Par exemple:
select left(Fname,2) from new_employees
(No column name)
Ka
Pi
Ka
Pi
Ka
Pi