10
votes

Explication de la table SQLITE_STAT1

J'essaie de diagnostiquer pourquoi une requête particulière est lente contre SQLite. Il semble y avoir de nombreuses informations sur Comment fonctionne l'optimiseur de requête , mais des informations de SAFANT sur la manière de réellement Diagnostiquer les problèmes.

En particulier, lorsque j'analysez la base de données, je reçois la table SQLITE_STAT1 attendue, mais je ne sais pas ce que la colonne Stat me dit. Un exemple de ligne est: xxx

Qu'est-ce que le "25112 1 1 1 1 1" signifie réellement?

comme une question plus large, quelqu'un a-t-il de bon Ressources sur les meilleurs outils et techniques permettant de diagnostiquer la performance de la requête SQLITE?

Merci


1 commentaires

Je viens de trouver mon problème de performance était dû à un index manquant sur une table de jointure, mais c'était plus d'intuition que le diagnostic. J'aimerais vraiment comprendre le processus de diagnostic de l'utilisation de l'indice SQLite plus.


4 Réponses :


5
votes

à partir d'analyses.c: xxx


0 commentaires

0
votes

Exécuter simplement expliquer Expliquez Plan de requête + votre instruction SQL, vous trouverez si les tables mentionnées sur l'instruction utilisent l'index que vous souhaitez, sinon, essayez de réécrire le SQL, si oui, déterminez si l'index correct que vous souhaitez. utilisation. Plus d'infos PLZ Reportez-vous à www.sqlite.org


0 commentaires

1
votes

Aussi, i = (k + d-1) / j signifie: k est supposé un nombre total de lignes et D est des valeurs distinctes pour chaque colonne, Donc, si vous avez une table créée avec Créer un test de table (C1 INT, C2 Texte, C3 INT, C4 INT); et vous créez une index comme créer index iDX sur test (C1, C2)

Ensuite, vous pouvez insérer manuellement ou laisser SQLite à jour automatiquement la table SQLITE_STAT1 comme suit: "Test" -> Nom de la table, "IDX" -> Nom d'index, "10000 1 1000", ici, 10000 est votre nombre total de lignes dans le test de tableau, 1 moyen, pour la colonne C1, toutes les valeurs semblaient être Distinct, cela ressemble à C1 est quelque chose comme des identifiants ou peu importe, 1000 signifie C2 a moins de valeur distincte, comme vous le savez, plus la valeur est élevée, les valeurs moins distinctes l'indice fait référence à la colonne spécifique.

Vous pouvez exécuter analyser ou mettre à jour manuellement la table. (Mieux vaut faire le premier).

Alors qu'est-ce que la valeur utilise? SQLite utilisera ces statistiques, pour trouver le meilleur indice qu'ils souhaitent utiliser, vous pouvez envisager créer index iDX2 sur test (C2) "et la valeur de STAT1 Table est" 10000 1 et et et Créez l'index IDX1 sur test (C1) "avec la valeur" 10000 100 "; Supposons que nous n'avions pas d'index IDX que nous avons défini auparavant, lorsque vous publiez SELECT * Test du formulaire lorsque c1 =? Et c2 =? , SQLite choisira IDX2, mais pas IDX1, pourquoi? C'est simple, car IDX2 peut minimiser les résultats de la requête, mais IDX1 non.

clair?


0 commentaires

2
votes

N'oubliez pas qu'un index peut être composé de plusieurs colonnes d'une table. Donc, dans le cas du "25112 1 1 1 1 1", cela serait décrit comme un indice composite composé de 4 colonnes d'une table. Les chiffres signifient comme suit:

  • 25112 est une estimation du nombre total de lignes dans l'index
  • Le deuxième entier (le premier "1") est une estimation du nombre de lignes ayant la même valeur dans la 1ère colonne de l'index.
  • Le troisième entier (le second "1") est une estimation du nombre de lignes ayant la même valeur pour les deux premières colonnes de l'index. Ce n'est pas la "distinction" de la colonne 2.
  • Le quatrième entier (la troisième "1") est une estimation du nombre de lignes ayant les mêmes valeurs pour les trois premières colonnes de l'index.
  • même logique pour le dernier entier ..

    Le dernier entier doit toujours être un. Considérez une table qui comporte deux rangées et deux colonnes avec un indice composite composé de colonne1 + colonne2. Les données sont la table est la suivante:

    1. pomme, rouge
    2. pomme, vert

      Les statistiques ressembleraient à "2 2 1". Signification, il y a 2 rangées dans l'index. Il y a deux rangées qui seraient retournées si seulement en utilisant la colonne1 de l'index (Apple et Apple). Et 1 ligne unique qui serait renvoyée à l'aide de colonne1 + colonne2 (Apple + rouge est unique à partir de pomme + vert)


0 commentaires