La SARGabilité

Oct 13, 2021

Qu’est ce que la SARGabilité : 

Dans le monde des RDBMS (Relational DataBase Management System), SGBDR en Français (Système de Gestion de Base de Données Relationnel), le terme Anglais “SARGABLE” qui est la contraction des mots “Search” + “ARGument” + “ABLE”, indique si une condition de filtrage (un prédicat) va pouvoir s’appuyer sur un index dans une recherche de données.

 

Si c’est le cas, l’expression est dite SARGABLE et à l’exécution de la requête, un index sera utilisé pour trouver les lignes correspondantes au prédicat. Le temps de réponse en sera grandement amélioré tout en nécessitant moins de ressources systèmes (accès disques / utilisation CPU / …).

 

Dans le cas contraire, le moteur de bases de données sera dans l’obligation de parcourir toutes les lignes de la table pour satisfaire la demande. Ce qui peut-être très long quand beaucoup de données sont présentes dans une table.

 

SARGABLE / Not SARGABLE

Attention, des différences existent entre les différents moteurs de bases de données. Ce qui est vrai pour un SGBD peut l’être partiellement pour un autre voir être faux pour un troisième.

SARGABLE : 

Les prédicats contenant les opérateurs suivants =, >, <, >=, <=, <>, BETWEEN, IS [NOT] NULL

LIKE avec un wildcard à la toute fin d’une chaîne de caractère peut être SARGABLE (Ex: Col1 LIKE ‘machainedecara%’).

Non SARGABLE :

Les prédicats contenant un NOT, OR ou un IN avec plusieurs valeurs.

Les LIKE commençant ou contenant un caractère joker ailleurs qu’en dernière position.

Les prédicats sur des colonnes où une opération est appliquée.

L’application de fonctions aux colonnes.

Et pour finir, attention au transtypages implicites (un champ en varchar égale une chaine de caractère unicode (Ex : FldNonUnicode1 = N’valeur’) qui peuvent poser soucis.

Un exemple concret chez Mindbaz

Il est souvent nécessaire pour diverses raisons de rechercher toutes les adresses emails d’un FAI / WebMail particulier (Ciblage / Calculs de statistiques / MaJ / Flag / …). 

La requête la plus évidente pourrait être de ne prendre que les adresses contenant le domaine (ex : @monFAI.fr”). Dans ce cas, le moteur de base de données va devoir parcourir toutes les adresses emails à la recherche de la chaîne de caractères “@monFAI.fr”.

Pour gagner du temps et des ressources, toutes les bases Mindbaz possèdent un champ (FLD37) qui ne contient que la partie domaine de l’adresse email. Cela permet de rapidement récupérer les adresses d’un domaine particulier.

 

Voici les résultats d’un test simple retournant 6 adresses sur une base de données contenant un peu plus de 25M d’adresses: 

 

PrédicatTemps d’exécutionNombre de lectures
fld1 like ‘%orange.be’60 946 ms200 492
fld37 = ‘orange.be’3 ms47
(6 rows affected)
Table 'TBL_SUBSCRIBER'. Scan count 1, logiciel reads 200492
SQL Server Execution Times:
CPU Time = 56484 ms, elapsed time = 60946 ms.

(6 rows affected)
Table 'TBL_SUBSCRIBER'. Scan count 1, logiciel reads 47
SQL Server Execution Times:
CPU Time = 0 ms, elapsed time = 3 ms.

Photo by Daniel Lerman on Unsplash