2012-05-24 2 views
1

J'ai un programme qui effectue quelques calculs dans une requête SQL. Il existe des centaines de milliers de lignes (certaines mesures de périphérique) dans une table SQLite et, à l'aide de cette requête, l'application fractionne ces mesures en groupes de 10000 enregistrements, par exemple, et calcule la moyenne de chaque groupe. Ensuite, il renvoie la valeur moyenne pour chacun de ces groupes.Augmentation des performances de SQLite SELECT

La requête ressemble à ceci:

SELECT strftime('%s',Min(Stamp)) AS DateTimeStamp, 
AVG(P) AS MeasuredValue, 
((100 * (strftime('%s', [Stamp]) - 1334580095))/
    (1336504574 - 1334580095)) AS SubIntervalNumber 
FROM LogValues 
WHERE ((DeviceID=1) AND (Stamp >= datetime(1334580095, 'unixepoch')) AND 
    (Stamp <= datetime(1336504574, 'unixepoch'))) 
GROUP BY ((100 * (strftime('%s', [Stamp]) - 1334580095))/
    (1336504574 - 1334580095)) ORDER BY MIN(Stamp) 

Les chiffres de cette demande sont remplacés par ma demande avec certaines valeurs. Je ne sais pas si je peux optimiser cette requête plus (si quelqu'un peut m'aider à le faire, j'apprécierais beaucoup)

Cette requête SQL peut être exécutée en utilisant un shell de ligne de commande SQLite (sqlite3. EXE). Sur mon ordinateur Intel Core i5, il faut compter 4 secondes (il y a 100 000 enregistrements dans la base de données en cours de traitement). Maintenant, si j'écris un programme C, en utilisant l'interface sqlite.h C, j'attends 14 secondes pour que la même requête se termine exactement. Ce programme C "attend" pendant ces 14 secondes lors du premier appel de la fonction sqlite3_step() (tous les appels sqlite3_step() suivants sont exécutés immédiatement).

Depuis le Sqlite download page J'ai téléchargé le code source du shell de ligne de commande SQLite et je l'ai construit en utilisant Visual Studio 2008. Je l'ai exécuté et j'ai exécuté la requête. Encore 14 secondes.

Alors, pourquoi un outil de ligne de commande prédéfini, téléchargé à partir du site Web sqlite, ne prend que 4 secondes, alors que le même outil, construit par moi, prend 4 fois plus de temps à s'exécuter?

Je suis sous Windows 64 bits. L'outil prédéfini est un processus x86. Il ne semble pas non plus optimisé multicœur - dans un gestionnaire de tâches, lors de l'exécution de la requête, je ne peux voir qu'un seul noyau occupé, à la fois pour les shells SQLite construits à la fois et pré-construits.

De toute façon je pourrais faire mon programme C exécuter cette requête aussi vite que l'outil de ligne de commande précompilé le fait?

Merci!

Répondre

0

Avez-vous enregistré des horodatages avant et après la requête? Difficile de savoir où votre programme est retenu sans voir le code.

+0

Oui, j'ai consigné l'heure. Je fais les étapes habituelles pour un programme C: sqlite3_open(), sqlite3_prepare_v2(), while (sqlite3_step() == SQLITE_ROW) {...} sqlite3_finalize(). Le programme aide pendant le premier sqlite3_step() pendant 14 secondes. Tous les sqlite3_step() suivants sont exécutés immédiatement. J'ai aussi essayé de compiler la console sqlite par moi-même - et à partir de cette console, j'ai les mêmes basses performances. Alors que depuis la console prédéfinie la requête ne prend que 4 secondes pour s'exécuter ... – user1406340

Questions connexes