2014-04-18 2 views
2

En sqlite (en particulier la version 3), ANALYZE doit-il être exécuté dans une transaction? Si oui, et je suis à la fin d'une longue transaction qui a fait beaucoup de changements, est-ce possible d'exécuter ANALYZE dans cette même transaction ou cette transaction doit-elle être engagée en premier et commencer une autre transaction pour ANALYZE?Est-ce que ANALYZE doit être exécuté dans une transaction?

The documentation ne dit rien à ce sujet d'une façon ou d'une autre.

Répondre

1

ANALYZE lit les données des colonnes indexées et écrit des informations statistiques dans une table interne. Ce est un peu similaire à la requête suivante:

INSERT OR REPLACE INTO sqlite_statXXX 
SELECT 'MyTable', 'MyColumn', COUNT(*), AVG(MyColumn) FROM MyTable 

fait une fois pour chaque colonne indexée.

Comme toute autre instruction SQL qui écrit une petite quantité de données à la base de données, les frais généraux de transaction sera beaucoup plus grande que l'effort réel pour écrire les données lui-même.

Dans votre cas, il n'est pas nécessaire pour que vos données modifiées soient disponibles sans les statistiques modifiées, donc vous pouvez tout aussi bien faire l'ANALYSE dans la même transaction.

Si la base de données est si grand que ANALYSER fonctionne depuis longtemps, il peut être judicieux de retarder son exécution jusqu'à ce que plus tard, quand il ne pas en conflit avec des transactions plus importantes.

Questions connexes