Bonjour serge0934,
Pour ton exemple, les 2 ordres SQL seront de même performance (index ou non).
Effectivement il y a aura bien un balayage (MAIS de table ou d'index ).
(Donc le support Sybase a peut être mal compris ta question. peut être mal formulé ? ).
Si par contre tu modifie l'odre avec le substring
SELECT 1 FROM Table1 WHERE substring(champ1,2,1)='Z'
Là tu peux avoir une très grosse différence si un index était utilisable au départ.
Dans ce cas, pour le LIKE il y aura toujours un balayage de l'index alors que pour le SUBSTRING il y aura un balayage de table.
Attention (on va maintenant relativiser
):
Le fonctionnement des optimiseurs est évidemment bien compliqué.
Pour rappel l'optimiseur SQL Server est de type CBO (il compare des coûts). Aussi, s'il estime que le coût d'un balayage de table est moins couteux que celui de l'index ... bein il y aura un table scan.
Et donc dans mon exemple modifié SUBSTRING(x,2,1) aura le même coût que le LIKE. (TABLE SCAN pour les deux)
Maintenant je vois venir ta question... Comment un balayage de table peut-il être préféré un balayage d'index ?
C'est fonction de la volumétrie de ta table, de ton ordre SQL , etc ...
Si par exemple tu fais un
SELECT * FROM Table1 WHERE champ1 LIKE 'Z%'
Il se peut que l'index qui pouvait être utilisé ne le soit pas (sauf index couvrant). le fait de demander tous les champs de la table oblige à servir tous les champs (via l'index ou index+table).
Dans ce cas un TABLE SCAN peut être appliqué.
Si le sujet t'interesse, je te recommande de regarder du coté optimiseur , plan d'éxécution et Index.
PS: un moyen de vérifier les coûts est de comparer les plans d'éxécution
Voila en espérant que cela soit clair
Partager