2009-08-06 10 views
3

J'ai une base de données sqlite utilisée pour stocker des informations sur les jobs de sauvegarde. À chaque exécution, il augmente d'environ 25 Mo en ajoutant environ 32 000 entrées à une table particulière.Effet de clé primaire sur les performances dans SQLite

Cette table est une "table de mappage" utilisée pour lier certaines informations aux enregistrements d'une autre table ... et elle contient une clé primaire (autoincrement int) que je n'utilise pas. Sqlite réserve 1, 2, 4 ou 8 octets pour la colonne INT en fonction de sa valeur. Cette table n'a que 3 colonnes supplémentaires, également de type INT.

J'ai ajouté des index à la base de données sur les colonnes que j'utilise comme filtres (WHERE) dans mes requêtes.

En présence d'index, etc. et dans le cas décrit, les clés primaires ont-elles un avantage utile en termes de performances?

Note: Les performances sont très, très importantes pour ce projet - mais pas si 10ms sauvegardés sur un travail de 32.000 entrées signifie 10MB de données supplémentaires!

Répondre

2

Un index de clé primaire est utilisé pour rechercher une ligne pour une clé primaire donnée. Il est également utilisé pour s'assurer que les valeurs de clé primaire sont uniques.

Si vous effectuez une recherche dans vos données à l'aide d'autres colonnes, l'index de clé primaire ne sera pas utilisé et, par conséquent, ne générera aucun avantage en termes de performances. Sa simple existence ne devrait pas non plus avoir un impact négatif sur les performances.

Un index inutile gaspille de l'espace disque et rend les instructions INSERT et UPDATE plus lentes. Cela ne devrait pas avoir d'impact négatif sur les performances des requêtes.

+0

Je suis plutôt d'accord avec ça. L'idée importante est de garder la base de données en mémoire, et si les index sont trop volumineux, cela peut avoir de l'importance. – Unknown

+0

@Unknown: pour une base de données de mise en cache de mémoire sauvegardée sur un disque, les index inutilisés ne doivent pas entrer dans la mémoire, et s'ils le sont, ils seront expulsés assez rapidement. Mais oui, si vous construisiez une base de données en mémoire complète sans stockage de disque de sauvegarde, ces index vous blesseront probablement. – Thilo

0

Si vous n'utilisez pas vraiment cet identifiant, ne laissez-vous pas tomber cette colonne + clé primaire? La seule raison de conserver une colonne d'ID de clé primaire non utilisée est de permettre la création d'une relation maître-détail avec une autre table.

Une autre possibilité consiste à conserver la colonne mais à supprimer la clé primaire. Cela signifie que l'application doit prendre soin de fournir un identifiant unique avec chaque instruction d'insertion. Avant et après chaque opération par lots, vous devez vérifier si cette colonne est toujours unique. Cela ne fonctionne pas par exemple dans MySQL et Oracle en raison de problèmes de simultanéité mais cela fonctionne dans sqlite.

Questions connexes