Haftpflicht Blogger
Virtual Server von Host Europe

SQLite – Performance bei Tabellenzugriffen

| 30. November 2013 | Keine Kommentare

SQLite Logo

RowIDs und der INTEGER PRIMARY KEY

Eine SQLite Tabelle hat neben den vom Entwickler definierten Primary Key (single or compound key) auch noch einen internen Zugriffsschlüssel, der sogenannten „rowid„. Auf diese ROWID kann man mit „rowid“, „oid“ oder „_rowid_“ (alle case-insensitive) zugreifen [1].

Da jede SQLite Tabelle über diese ROWID in einer B-Tree Struktur aufgebaut ist, sind Eintragssuchen und Sortierungen von Einträgen, die über diese ROWID laufen, etwa doppelt so schnell wie die Suchen über einen normalen, vom Entwickler angelegten technischen Tabellenschlüssel (z.B. TRANSPORT_ID von der Tabelle TRANSPORT).

Kaum ein Entwickler wird jedoch bei der Erstellung eines Datenbankselects nun nach einer ROWID suchen, anstatt nach einer bestimmten TRANSPORT_ID Nummer oder nach einer vorgebenen Gruppe von TRANSPORT_IDs.

Spaltenalias – TRANSPORT_ID wird zur ROWID

Glücklicherweise gibt es einen „Alias-Trick“.

Die ROWID ist ein 64-bit signed INTEGER Key. Wenn ein Tabellenfeld als PRIMARY KEY definiert wird mit dem Typ INTEGER, dann wird dieses Feld von SQLite zu einem ALIAS für die ROWID.  Gegenüber einer Typdefinition mit INT hat man also die doppelte Zugriffsgeschwindigkeit.

Wird das Tabellenfeld mit einem anderem Integer-Typ wie INT oder BIGINT oder SHORT INTEGER oder UNSIGNED INTEGER definiert, dann betrachtet SQLite dieses Feld nur als Integer-ähnlich und nicht als Alias für die ROWID, also auch keinerlei Performancevorteil.

Unique Index auf Primary Key

Primary Keys sind per Definition eindeutig und es wird intern ein Index in der Datenbank angelegt. Wenn zusätzlich ein „create unique index“ auf den PRIMARY KEY gelegt wird, dann ist dies formal möglich, bedeutet aber einen signifikanten Overhead (doppelte Indexierung eines schon indexierten Feldes) und damit keinen Performancegewinn und Optimierung, sondern das Gegenteil [1].

 

Links:

[1] SQL As Understood By SQLite:  Create Table

 

Stichworte: , , , ,

Kategorie: Android, SQL

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.