Il existe un dernier type de problème intelligent qui empêche l'utilisation correcte des index. Au lieu d'utiliser les expressions logiques, cela passe par les calculs.
Considérons la requête suivante. Peut-elle utiliser un index sur
NOMBRE_NUMERIQUE
?
SELECT nombre_numerique
FROM nom_table
WHERE nombre_numerique - 1000 > ?
De façon similaire, la requête suivante peut-elle utiliser un
index sur A
et B
(vous choisissez l'ordre) ?
SELECT a, b
FROM nom_table
WHERE 3*a + 5 = b
Prenons un angle de vue différent. Si vous développez un moteur de bases de données SQL, ajouteriez-vous un module de résolution d'équations ? La plupart des développeurs de bases de données diront simplement non. Et du coup, aucun des deux exemples ci-dessus ne peut utiliser un index.
Vous pouvez même utiliser les mathématiques pour rendre difficile
l'utilisation d'un index sur une condition, de façon intentionnelle,
comme nous l'avions fait précédemment
pour la recherche plein texte avec LIKE
. Il suffit
d'ajouter zéro, comme dans cet exemple :
SELECT nombre_numerique
FROM nom_table
WHERE nombre_numerique + 0 = ?
Néanmoins, nous pouvons indexer ces expressions avec un
index fonctionnel si nous
utilisons des calculs d'une façon intelligente et si nous transformons
la clause where
comme une équation :
SELECT a, b
FROM nom_table
WHERE 3*a - b = -5
Nous avons déplacé les références à la table d'un côté et les constantes de l'autre. Du coup, nous pouvons créer un index fonctionnel pour le côté gauche de l'équation :
CREATE INDEX math ON nom_table (3*a - b)