Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

21fév/110

AIR SQLite – Optimisation des performances

On l'a vu tout au long de ces derniers tutoriaux sur SQLite avec AIR, il existe de nombreuses manières d'utiliser une base SQLite. La plupart fonctionne mais toutes ne donnent pas les mêmes performances.

Voici un petit récapitulatif des opérations que vous pouvez mettre en place pour optimiser les traitements de votre base SQL

Mode asynchrone

Comme discuté dans l'article "AIR SQLite – Mode synchrone et asynchrone", une base SQLite peut être ouverte de deux manière. La première (synchrone) est simple à utiliser mais va ralentir votre application lors des gros traitements. La seconde (asynchrone) est plus difficile à mettre en place car il faut jouer avec une mécanique évènementielle mais elle a l'avantage de ne pas stopper le déroulement de votre application:

AIR SQLite – Mode synchrone et asynchrone

Un passage en mode asynchrone peut permettre une meilleure expérience utilisateur (ressentie).

Pré-créer Ré-utilisez les objets de connexion (SQLConnection)

L'ouverture d'une base de données SQLite peut-être coûteuse, mais une fois que votre base est ouverte, vous pouvez ré-utiliser l'objet SQLConnection par la suite, inutile de re-créer des connexions à la base.

Même si vous n'utilisez pas de SQLConnection au démarrage de votre application, lancez l'ouverture de base de données en fond, cela vous évitera un délai quand vous aurez besoin d'accéder à la base pour la première fois.

Utilisation des requêtes SQL paramétrées

L'utilisation de requêtes SQL paramétrées peut grandement améliorer les performances de votre application. Plus d'information sur cet article:

AIR SQLite – Utilisation de requête paramétrée (SQLStatement parameters)

Au lieu de compiler N fois des requêtes successives, la base de va faire cette compilation qu'une seule fois ce qui va représenter un gain de temps énorme par la suite car cette étape de compilation peut être lourde.

Utilisation des transactions

L'utilisation des transactions va se faire le plus souvent en conjonction avec l'utilisation des requêtes SQL paramétrées. Les transactions vont vous permettre de faire des requêtes en masses ("bulk") comme des INSERT ou des UPDATE en un temps record.

Ci-dessous, un petit graphique représentant cette différence de performances (au dessus de 10 000 records, les résultats n'ont pas été enregistrés sans transaction car trop longs):

benchmark_bulk_insert_sqlite

Voici quelques tutoriaux AIR pour vous aider à mettre en place ces processus de transaction:

AIR SQLite – Utilisation des transactions (begin / commit / rollback) en synchrone

AIR SQLite – Utilisation des transactions (begin / commit / rollback) en asynchrone

Préciser le nom de la base de données dans chaque requête

Dans un fichier contenant une base SQLite, vous pouvez avoir plusieurs bases de données. De base, si vous ne préfixez pas le nom de votre database, la database "main" (database par défaut) sera utilisée. Même si vous n'utilisez qu'une database, ajouter "main" devant le nom de votre table va accélérer le traitement car le moteur d'exécution n'aura pas besoin de déterminer dans quelle database se trouve votre table.

Au lieu d'utiliser

SELECT employeeId FROM employees

utilisez donc

SELECT employeeId FROM main.employees

Toujours préciser le nom des colonnes à récupérer dans un SELECT ou un INSERT

Vous connaissez sûrement le nom de colonnes que vous allez récupérer lorsque vous faîtes un SELECT ou un INSERT. Au lieu d'utiliser "*", il est préférable de spécifier le nom des colonnes à récupérer, encore une fois pour éviter que le runtime doive les déterminer lui-même (coûteux)

Paginer la récupération de résultat (SELECT)

Si vous devez récupérer des centaines / milliers d'enregistrement, il est préférable de découper ce processing grâce à un système de pagination. Ce process est décrit dans l'article suivant:

AIR SQLite – Paginer la récupération d'un SELECT avec le paramètre prefetch (pagination)

De la même manière, si l'utilisateur ne voit au départ que 10 résultats, vous pouvez récupérer les 10 premiers puis récupérer les suivants dans un processus en arrière-plan qui donnera une illusion de rapidité.

Utiliser des index de manière judicieuse

L'utilisation des index est une règle générale en SQL mais celle-ci doit être utilisée avec parcimonie. Il est notamment utile sur des colonnes sur lesquelles vous allez utiliser une clause WHERE. Par exemple sur une colonne sur laquelle vous allez effectuer une recherche à partir d'une entrée utilisateur. Si vous recherchez sur 2 colonnes (first name et last name par exemple), il est préférable d'indexer une colonne qui fait la concaténation des 2 plutôt que d'indexer chaque colonne.

Vous pouvez aussi utiliser la méthode "analyse()" sur une SQLConnection pour aider la database à préparer les futurs traitements:

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/data/SQLConnection.html#analyze%28%29

Éviter les changements de structure

Cette considération peut-être difficile à appliquer mais il faut savoir que les changements de structures de tables (ajout de colonnes, ajout de table, …) peuvent avoir un aspect négatif sur les performances de votre application.

En effet, une base SQLite est conservé sur le disque sous forme de fichier. Lorsque vous modifiez la structure de la base, ces modifications vont être écrites à la fin du fichier. Lorsque la base va essayer de déterminer les colonnes d'une table par exemple, le traitement sera plus long si la donnée est éparpillée dans le fichier. C'est un peu comme le processus de fragmentation sous Windows.

Pour résoudre ce problème et "dé-fragmenter" la base SQL, vous pouvez exécuter un SQLConnection::compact() sur la base de données afin de rassembler les définitions. Attention, plus votre base est grande, plus cette opération sera coûteuse.

Ressources

Voici quelques ressources pour vous aider à optimiser votre base SQLite:

6jan/092

Flex ActionScript – Optimiser votre code AS3

Le dernier article parlait de la manière la plus rapide de copier une ArrayAS3. Ce genre d'optimisation simple peut vous permettre d'accélérer vos temps de calcul lorsque vous faîtes de lourdes opérations en ActionScript. Voici quelques conseils qui vous permettront d'optimiser facilement votre code ActionScript. La plupart de ces conseils sont repris de plusieurs blog dont le wiki d'OsFlash

Conseils et généralités

N'utilisez pas de type Object si  vous connaissez les propriétés que vous allez utiliser. Par exemple, si vous voulez définir un point dans l'espace, vous pourriez créer un Object avec 3 propriétés (x, y, z). Pourtant, il faudrait mieux créer une classe Vertex avec ces 3 propriétés xyz. Les performances sont bien meilleures!