SQL

Anti-pattern : fonction sur colonne indexée (non sargable)

DATE_TRUNC ou EXTRACT appliqué à la colonne interdit l'usage de l'index. Réécrire le filtre en plage de valeurs le rend sargable, et l'index B-tree redevient utilisable.

Cas d'usage

Requête par jour/année sur une table horodatée volumineuse passant en Seq Scan.

Prérequis

Tout moteur — le principe est universel

SQL
-- Anti-pattern : la fonction sur la colonne neutralise l'index
SELECT * FROM orders
WHERE DATE_TRUNC('day', created_at) = '2026-06-10';

-- Correctif : filtre en plage, index exploitable
SELECT * FROM orders
WHERE created_at >= '2026-06-10'
  AND created_at <  '2026-06-11';

-- Même logique pour une année entière
SELECT * FROM orders
WHERE created_at >= '2026-01-01'
  AND created_at <  '2027-01-01';

Résultat

-- Avant (fonction sur colonne) :
 Seq Scan on orders (actual time=0.018..1240.221 rows=412)
   Filter: (date_trunc('day', created_at) = '2026-06-10')
 Execution Time: 1271.480 ms

-- Après (filtre en plage) :
 Index Scan using idx_orders_created on orders
   (actual time=0.044..0.892 rows=412)
 Execution Time: 1.024 ms   -- x1200 plus rapide
SQLSargableIndexAnti-pattern

Snippets liés

Retour au Data Lab