web-dev-qa-db-fra.com

SUBSTRING vs LEFT dans SQL SERVER

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? 

11
Dhwani

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. 

14
Remus Rusanu

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>
16
Mikael Eriksson

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.

5
Do What You Love

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.

2

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
0
Vinoth_S