par Guillaume Lelarge.

Mathématiques


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)

À propos de l'auteur

Photo de Markus Winand

Markus Winand teaches efficient SQL—inhouse and online. He minimizes the development time using modern SQL and optimizes the runtime with smart indexing—for that he also published the book SQL Performance Explained.

“Use The Index, Luke!” by Markus Winand and translated by Guillaume Lelarge is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Mentions légales | Contact | NO WARRANTY | Marque déposée | Privacy | CC-BY-NC-ND 3.0 license