Accélérer les requêtes avec TableStudio
TableStudio mesure, ne se contente pas de deviner. Ne recommandez jamais un index ou une réécriture par intuition alors que vous pouvez le prouver avec les outils ci-dessous. La plupart d'entre eux sont réservés à PostgreSQL ; sur d'autres moteurs, utilisez explain_query et raisonnez à partir du plan.
Choisissez d'abord la connexion, comme décrit dans la compétence database-workflow. Privilégiez l'analyse sur une base de données avec des données réalistes. Une base de développement presque vide donne des plans trompeurs.
Trouver ce qui est lent
- L'utilisateur nomme une requête ou un endpoint : trouvez le SQL qu'elle exécute (à partir du code ou des journaux ORM), puis allez dans "Diagnostiquer une instruction".
- "Pourquoi la base de données est-elle lente ?" Appelez
slow_queries. Il classe les instructions par temps total à partir depg_stat_statements. Conservez lequery_idde chaque ligne ; les autres outils l'acceptent. Si l'extension n'est pas installée, l'outil explique ce qu'implique son activation, transmettez ces informations plutôt que de l'installer sans demander. - Réglage général :
workload_index_advisortrouve le moins d'index qui couvrent le plus de temps de base de données et liste les index existants qui ne sont jamais utilisés.
Un bilan de santé
Lorsque l'utilisateur demande ce qui ne va pas avec une base de données, ou souhaite une revue générale, ne modifiez rien et rapportez :
database_health. Lisez sa listeunavailableavant de résumer : une liste de constats vide avec des entrées ici signifie que les vérifications ont été ignorées, pas que tout va bien.database_overviewpour la taille, les tables les plus grandes et les plus actives, et le nombre de connexions.schema_issues(sanstable) pour les problèmes de conception sur l'ensemble de la base de données.
Placez les constats les plus importants en premier, en langage clair : ce qui ne va pas, son coût si ignoré, et le correctif. Incluez le verify_sql de chaque constat pour que l'utilisateur puisse vérifier le nombre, et tout lock_impact du correctif. Proposez de mettre en œuvre les correctifs choisis par l'utilisateur via "Mettre en production" ci-dessous.
Diagnostiquer une instruction
optimize_queryavec le SQL (etquery_ids'il provient deslow_queries). Pour une instruction en lecture seule, passezanalyze: trueafin que les vérifications mesurées puissent s'exécuter. Il s'exécute une fois dans une transaction annulée. Il signalealready_fastlorsqu'il n'y a rien à faire ; dites-le plutôt que d'inventer une amélioration.- Pour plus de détails, utilisez
explain_query(analyze: truepour les lectures uniquement). Comparezactual_rowsavecestimated_rowssur chaque nœud. Un écart important signifie des statistiques obsolètes (lancezANALYZEsur la table), ce qui est souvent le véritable bogue plutôt qu'un index manquant. - Une instruction avec des paramètres
$1, $2a besoin de vraies valeurs pour planifier honnêtement.suggest_parameter_valuesles trouve à partir de l'historique, des sessions actives et des statistiques.
Prouver le correctif
Utilisez benchmark_query_variants (le Laboratoire de requêtes) avant de recommander quoi que ce soit :
- Donnez-lui le SQL de référence et les candidats comme
variants: unsqlréécrit, deshypothetical_indexes(planifiés avec hypopg, jamais construits),hide_indexes, ou des paramètressettingsdu planificateur. Ou omettezvariantset laissezfind_fasterproposer les siens. - Il rapporte les médianes sur plusieurs exécutions pour chaque ensemble de paramètres et vérifie que chaque réécriture retourne les mêmes lignes que la référence.
- Ne recommandez qu'une variante dont
same_rowsest oui. Préférez la variante dansrecommendation. Citez les mesures avant et après, pas des pourcentages issus de l'intuition.
Avant de supprimer un index (inutilisé ou en double), exécutez index_what_if avec celui-ci dans hide. Toute instruction qui devient plus coûteuse, ou qui utilise l'index aujourd'hui, serait impactée.
Mettre en production
Les index et les réécritures passent par le flux de changement normal de la compétence database-workflow :
- Les modifications d'index sont des modifications de schéma. Si le dépôt a un outil de migration, ajoutez l'index là. Sinon, proposez-le avec
stage_migration, avec les mesures chiffrées dansrationale. - Sur PostgreSQL, utilisez
CREATE INDEX CONCURRENTLYpour toute table qui voit du trafic, et ne l'enveloppez pas dans une transaction. - Une réécriture de requête est une modification de code : modifiez le code qui l'émet et mentionnez le résultat du benchmark dans votre résumé.