L’une des meilleures parties du langage SQL est qu’il est facile d’apprendre et de suivre les commandes, tout cela grâce à leur syntaxe simple.
Mais voici le hic : toutes les fonctions des bases de données ne sont pas efficaces. Deux requêtes peuvent se ressembler mais varier en termes de temps de calcul, et c’est ce qui fait toute la différence. C’est pourquoi l’optimisation des requêtes SQL est essentielle.
Si vous êtes une organisation qui utilise une base de données de production en direct à des fins de reporting et pour extraire des données actualisées, il est même important d’optimiser les requêtes SQL pour éviter de faire peser une charge inutile sur les ressources de la base de données de production.
Moyens d’affiner vos requêtes SQL
Ayez un ensemble clair d’exigences commerciales avant de commencer
L’une des meilleures façons d’optimiser les requêtes SQL est de faire les bonnes choses dès la case départ. Ainsi, avant de commencer, assurez-vous d’avoir coché les cases suivantes :
Il est essentiel d’impliquer toutes les personnes et équipes concernées lors du développement de la requête. En outre, il est même important d’impliquer l’équipe DBA tout en interrogeant les bases de données de production.
La meilleure pratique pour s’assurer que toutes vos exigences sont satisfaites est de répondre à 5 séries de questions – Qui ? Pourquoi ? Quoi ? Quand ? Où ?
La base de données de production joue un rôle crucial. Taxer la base de données avec des exigences ambiguës est bien trop risqué. Ainsi, avant d’exécuter une requête, assurez-vous que toutes les exigences sont spécifiques, et discutées avec les parties prenantes appropriées
Maîtriser l’art de créer des index correctement
L’optimisation des performances en SQL peut se faire en indexant correctement, ce qui se traduit par un accès plus rapide à la base de données lors des moments critiques. C’est un domaine où la plupart des novices en matière de bases de données échouent. Ils essaient soit de tout indexer, soit de ne rien indexer, et aucune de ces approches ne joue en leur faveur.
C’est parce que lorsque vous ne faites aucune indexation du tout, vos requêtes s’exécuteront lentement et mettront une charge inutile sur la base de données. D’autre part, si vous indexez tout, vos déclencheurs d’insertion ne fonctionneront pas comme prévu, rendant ainsi votre base de données inefficace. La clé ici est de trouver le bon équilibre.
Évitez d’utiliser SELECT*
SELECT* (lire comme select all) est souvent utilisé comme raccourci pour interroger toutes les données d’une table. Bien que cette méthode fonctionne bien pour les petites tables, elle charge inutilement les ressources de la base de données lorsqu’une requête est lancée sur une table comportant de nombreux champs et lignes.
La meilleure façon de procéder ici est de définir les champs dans l’instruction SELECT afin d’ordonner à la base de données d’interroger uniquement les données requises pour atteindre les objectifs finaux.
Permettons de mieux comprendre cela à l’aide d’un exemple :
Voici une manière inefficace car cette requête va récupérer toutes les données stockées dans la table Users indépendamment de vos besoins.
SELECT*
FROM Users
C’est la façon la plus efficace d’effectuer une requête car elle ne tire que les informations nécessaires et évite d’alourdir votre base de données.
SELECT LastName, Address, Contact
FROM Users
Utiliser les tables temporaires à bon escient
Bien que les tables temporaires soient très agréables à utiliser, elles augmentent la complexité d’une requête de manière exponentielle. Il est fortement recommandé d’éviter d’utiliser des tables temporaires si votre code peut être écrit simplement.
Cependant, si vous devez traiter une procédure stockée qui ne peut pas être traitée avec une seule requête, l’utilisation de tables temporaires comme intermédiaires peut mettre fin à vos malheurs.
Éviter d’utiliser COUNT()
L’une des façons courantes par laquelle les développeurs vérifient si un certain enregistrement existe est d’utiliser COUNT() au lieu de EXISTS(). COUNT() est inefficace car il scanne la table entière et compte toutes les requêtes qui satisfont votre condition. En revanche, EXISTS() est plus efficace car il sort de la boucle dès qu’il repère le résultat souhaité. Cela contribue à un meilleur fonctionnement, et fait des voies pour un code plus soigné.
Éviter d’utiliser des caractères génériques au début du motif LIKE
Afin d’affiner vos requêtes SQL, vous devez éviter d’utiliser le motif LIKE de la manière suivante :
SELECT* FROM Customers WHERE address LIKE ‘%bar%’;
Ici, la base de données ne pourra pas utiliser un index approprié s’il existe à cause du caractère générique %. Le système commence par effectuer un balayage complet de la table et cela nuit à sa vitesse. Ainsi, la meilleure façon d’écrire cette requête est :
SELECT* FROM Customers WHERE address LIKE ‘bar%’;
Éviter d’utiliser SELECT DISTINCT
Bien que vous puissiez facilement éliminer les doublons d’une requête en utilisant SELECT DISTINCT, cette fonction consomme une quantité appréciable de puissance de traitement. De plus, cette requête fonctionne en regroupant tous les champs de la requête pour présenter des résultats distincts. Ceci, à son tour, la rend très imprécise.
La meilleure façon d’éviter tout enregistrement en double dans votre requête est d’ajouter plus de champs. De cette façon, il n’y aura pas de regroupement nécessaire, et les enregistrements récupérés seront précis.
Par exemple, voici une façon inefficace de procéder:
SELECT DISTINCT FirstName, LastName, State
FROM Users
Et voici la façon efficace de procéder :
SELECT FirstName, LastName, Contact, Address, State, Zip
FROM Users
Conseil bonus : Gardez certaines requêtes pour les heures creuses
Pour que votre base de données de production reste sûre et solide, il est fortement recommandé de programmer certaines requêtes aux heures creuses, idéalement lorsque le nombre d’utilisateurs simultanés est le plus faible. Ainsi, le milieu de la nuit, entre 3 et 5 heures du matin. est le meilleur moment pour exécuter des requêtes telles que :
- Les instructions en boucle
- L’exécution de SELECT* sur de grandes tables avec plus d’un million d’enregistrements
- Les sous-requêtes imbriquées
- Les recherches par caractères génériques
- CROSS JOINs
- Select DISTINCT statements
.
The Wrap Up
L’optimisation des performances en SQL est importante pour garder votre base de données en bonne santé, mais ce n’est pas la tâche la plus facile à accomplir. Les performances de vos requêtes SQL dépendent d’une série de facteurs tels que votre modèle de base de données, le type d’informations que vous devez récupérer, etc.
Il est fortement recommandé d’éviter toute situation embarrassante en gardant une trace de toutes les requêtes qui vont bientôt être tirées, et en fournissant les meilleures solutions. En tant que DBA, vous pourriez également équiper les développeurs d’un tableau de bord axé sur les données, de sorte qu’ils n’aient pas à lancer des requêtes de temps en temps pour récupérer les informations essentielles. Voici un article étonnant sur la façon dont vous pouvez créer un tableau de bord SQL qui tire des données directement de la base de données.
Quel est votre point de vue à ce sujet ? Comment faites-vous pour affiner vos requêtes SQL ? Faites-le nous savoir.