
Une condition (ou un prédicat) dans une requête est dite SARGable si le moteur SQL Server peut utiliser un index (seek au lieu de tout scanner) pour accélérer l’exécution de la requête.
👉 Le terme SARGable est une contraction de Search ARGument ABLE.
SARGable = index seek
Non-SARGable = index/table scan
Exemple
✅ SARGable (bien)
WHERE DateCommande >= ‘2026-01-01’
AND DateCommande < ‘2026-02-01’
- SQL Server peut faire un Index Seek
- Filtrage directement dans l’index
- Peu de lectures, rapide
❌ Non SARGable (mal)
WHERE CONVERT(date, DateCommande) = ‘2026-01-01’
Pourquoi ?
- La fonction est appliquée sur la colonne
- SQL Server doit :
- lire chaque ligne
- calculer CONVERT(date, DateCommande)
- comparer
👉 Scan garanti, même avec un index parfait.
Règle d’or
🔴 Jamais de fonction, calcul ou conversion sur la colonne filtrée
Fonctions qui cassent la SARGability :
- CONVERT, CAST, TRY_CONVERT
- YEAR(), MONTH(), DAY()
- ISNULL(col, 0)
- opérations arithmétiques (col + 1, col * 100)
- LIKE ‘%abc’ (joker à gauche)
Cas classique :
WHERE YEAR(DateCommande) = 2026
❌ Non SARGable
Version SARGable :
WHERE DateCommande >= ‘2026-01-01’
AND DateCommande < ‘2027-01-01’
TRY_CONVERT et SARGability
WHERE TRY_CONVERT(int, ColVarchar) = 10
❌ Non SARGable
Même problème : fonction sur la colonne.
Solutions :
1️⃣ Conversion en amont (staging)
ALTER TABLE T
ADD ColInt AS TRY_CONVERT(int, ColVarchar) PERSISTED;
CREATE INDEX IX_T_ColInt ON T(ColInt);
👉 Redevient 100 % SARGable
2️⃣ Convertir la constante (pas la colonne)
WHERE DateCommande >= CONVERT(datetime, ‘2026-01-01’)
✅ OK
La colonne reste “nue”.
Comment reconnaître un problème de SARGability ?
Indices typiques :
- Index présent mais jamais utilisé
- Index Scan au lieu de Index Seek
- Compute Scalar juste avant un Filter
- Lectures logiques élevées
- CPU inutilement haut
80 % des problèmes SARGability viennent de :
- Filtres sur dates
- Conversions implicites
- Colonnes varchar historiques
et 95 % se corrigent sans ajouter d’index !
Hey, oui c’est une notion fondamentale ! mettre des index et voir que c’est pour rien… A savoir pour tous les dev.