2010-08-17 4 views
2

Je rencontre des problèmes avec les performances de la base de données SQLite dans l'application Android dans le dispositif Samsung Galaxy GT-I9000. La base de données contient 10 tables de 3 à 8 colonnes chacune.SQLite est extrêmement lent dans Samsung Galaxy GT-I9000

Dès qu'un fichier de base de données gagne environ 400 Ko, les requêtes de mise à jour/insertion ont besoin de beaucoup plus de temps pour s'exécuter - 2 secondes! En comparaison avec d'autres appareils (HTC Magic, HTC Desire), les mises à jour/insertions prennent environ 40 msec!

Le fichier de base de données se trouve dans le répertoire de données de l'application. Le déplacement du fichier de base de données vers la carte SD augmente considérablement la vitesse.

Les commandes périodiques ANALYSE et VACUUM n'affectent pas la vitesse. Ainsi que la commande PRAGMA cache_size.

Avez-vous des idées pour améliorer la performance?

Toute idée est la bienvenue, sauf pour conserver la base de données dans la carte SD ou diviser la base de données en plusieurs fichiers contenant une table chacun.

+0

Comment gérez-vous les transactions? – WarrenFaith

Répondre

3

Utiliser des transactions et des requêtes paramétrées. Sqlite doit analyser chaque instruction sql si vous n'utilisez pas de requêtes paramétrées. Toute cette analyse inutile rend une instruction d'insertion simple 2 à 3 fois plus lente. Voir ici: How do I get around the "'" problem in sqlite and c#?

L'utilisation de transactions est également très importante car Sqlite peut effectuer une insertion très rapidement mais elle est lente, vous devez donc regrouper les insertions/mises à jour et les supprimer en une seule grosse transaction.

+0

Bon point. Cadencements avec des transactions sont les suivantes: (nombre de requêtes dans une transaction - durée moyenne d'une transaction en secondes) 40 à 3,5 s, 20 à 3,0 s, 10 à 2,8 s, 5 à 2,5 s, – plugmind

2

commandes d'insertion en vrac doivent se faire dans une transaction:

BEGIN TRANSACTION; 
// INSERTS 
COMMIT; 
2

Cela a beaucoup aidé et m'a motivé à chercher encore plus. Et j'ai trouvé une solution qui donne un énorme coup de pouce:

PRAGMA synchrone = OFF

requêtes INSERT/UPDATE exécuter 4 fois plus vite, maintenant.

Il présente cependant un petit inconvénient.

Plus de détails ici:
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#pragmas

+0

comment régler ceci? –

+0

Alors, quel est le "petit inconvénient"? Que nous pouvons perdre des données sur un accident d'application? Ou autre chose? –

4

accès à la carte SD interne est très lent sur le Samsung Galaxy S. Il existe une variété de inofficial lag fixes disponibles, il semble que le système de fichiers RFS de Samsung est responsable de la retards.

Espérons que Samsung publiera une mise à jour qui corrige ce problème, jusque là votre meilleur pari est d'éviter les E/S si possible.

+0

Également mentionné ici: http://kollerie.wordpress.com/2010/08/03/samsung-galaxy-s-peculiarities-02-lags/ – plugmind

Questions connexes