2009-08-06 3 views
3

Ich habe eine SQLite-Datenbank verwendet, um Informationen über Sicherungsaufträge zu speichern. Bei jedem Lauf erhöht sich die Anzahl der Einträge um ca. 25 MB, wenn in einer bestimmten Tabelle etwa 32.000 Einträge hinzugefügt werden.Primärschlüssel Auswirkung auf die Leistung in SQLite

Diese Tabelle ist eine "Zuordnungstabelle", die verwendet wird, um bestimmte Informationen mit Datensätzen in einer anderen Tabelle zu verknüpfen ... und sie hat einen Primärschlüssel (autoinkrement int), den ich nicht verwende.

sqlite reserviert je nach Wert 1, 2, 4 oder 8 Byte für die INT-Spalte. Diese Tabelle hat nur 3 zusätzliche Spalten, ebenfalls vom Typ INT.

Ich habe Indizes zu der Datenbank für die Spalten hinzugefügt, die ich als Filter (WHERE) in meinen Abfragen verwende.

Haben Primärschlüssel in der Gegenwart von Indizes usw. und in der beschriebenen Situation einen nützlichen Vorteil in Bezug auf die Leistung?

Hinweis: Leistung ist sehr, sehr wichtig für dieses Projekt - aber nicht, wenn 10ms gespeichert auf einem 32.000 Eintrag Job bedeutet zusätzliche 10MB Daten!

Antwort

2

Ein Primärschlüssel-Index wird verwendet, um eine Zeile für einen bestimmten Primärschlüssel nachzuschlagen. Es wird auch verwendet, um sicherzustellen, dass die Primärschlüsselwerte eindeutig sind.

Wenn Sie Ihre Daten mit anderen Spalten durchsuchen, wird der Primärschlüssel-Index nicht verwendet und führt daher zu keinem Leistungsvorteil. Seine bloße Existenz sollte jedoch auch keine negativen Auswirkungen auf die Leistung haben.

Ein unnötiger Index verschwendet Festplattenspeicher und bewirkt, dass INSERT- und UPDATE-Anweisungen langsamer ausgeführt werden. Es sollte keine negativen Auswirkungen auf die Abfrageleistung haben.

+0

stimme ich größtenteils damit überein. Die wichtige Idee ist, die Datenbank im Speicher zu behalten, und wenn die Indizes zu groß sind, dann kann das eine Rolle spielen. – Unknown

+0

@Unknown: Bei einer normalen disk-backed, Speicher-Caching-Datenbank sollten nicht verwendete Indizes nicht in den Speicher gelangen, und wenn dies der Fall ist, sollten sie relativ bald wieder entfernt werden. Aber wenn Sie eine komplette In-Memory-Datenbank ohne Backup-Plattenspeicher erstellen, werden Ihnen diese Indizes wahrscheinlich weh tun. – Thilo

0

Wenn Sie diese ID wirklich nicht verwenden, was fallen Sie nicht diese Spalte + Primärschlüssel? Der einzige Grund, eine nicht verwendete Primärschlüssel-ID-Spalte am Leben zu erhalten, besteht darin, eine Master-Detail-Beziehung mit einer anderen Tabelle zu erstellen.

Eine andere Möglichkeit besteht darin, die Spalte beizubehalten, aber den Primärschlüssel zu löschen. Das bedeutet, dass die Anwendung dafür sorgen muss, dass bei jeder insert-Anweisung eine eindeutige ID angegeben wird. Vor und nach jeder Batchoperation müssen Sie prüfen, ob diese Spalte noch eindeutig ist. Dies funktioniert beispielsweise nicht in MySQL und Oracle, da es Probleme mit mehreren Nebenläufigkeiten gibt, aber es funktioniert in sqlite.