Wird es zu Leistungsproblemen kommen, wenn ich ein Blob-Feld als Primärschlüssel in SQLite verwende?

8

Ich habe eine SQLite-Datenbank, in der alle Primärschlüssel GUIDs sind. Momentan werden sie als Strings fester Länge gespeichert, aber ich möchte sie als Blobs speichern, da sie den Code zum Speichern und Abrufen von Daten vereinfacht. Ich habe einen Teil der Datenbank konvertiert und alles funktioniert wie erwartet. Ich bin mir jedoch nicht sicher, ob ich Leistungsprobleme bekommen werde.

Wäre eine Anweisung wie diese beispielsweise in Strings schneller als in Blobs?

%Vor%

Meine Intuitionen sagen nein, aber das bedeutet eigentlich gar nichts.

    
Lawrence Barsanti 13.10.2009, 20:28
quelle

3 Antworten

12

Der beste Weg, das herauszufinden, besteht darin, die Abfragen gegen den Timer eines Profilers / SQLite auszuführen. Richten Sie einen Test ein und führen Sie die Abfrage 1000 Mal mit einer Zeichenfolge und dann 1000 Mal als Blob aus. Der Gewinner ist der Schnellste.

Intuition ist eine Sache, harte Daten sind eine andere.

    
Gavin Miller 13.10.2009, 20:31
quelle
3

Warum sollten Sie es nicht verwenden

Ein Primärschlüssel wird oft indexiert und zum Sortieren verwendet. Ein BLOB kann nicht indexiert werden, was es zum langsamsten aller Datentypen macht. In der Tat ist es die schlechteste Wahl als Primärschlüssel und die meisten Datenbanken, einschließlich des SQL99-Standards, verbieten dies.

Das Problem mit BLOB ist, dass sein Datentyp der Datenbank nicht bekannt ist (ein BLOB sollte nur für alles undefinierte verwendet werden, wie ein Logo, ein Bild, ein Word-Dokument, das nur als gespeichert werden kann Binärdaten). Daher kann es nicht optimiert werden. Ein anderes Problem ist die Anzeige. Ein Blob kann nicht einfach als Text angezeigt werden.

Die meisten SQL-Implementierungen lassen BLOB Felder nicht zu, aber SQLite erlaubt dies. Es konvertiert jedoch alles, was Sie zu einem Blob vergleichen und vergleicht es dann Stück für Stück.

Beste Alternative

Die beste Option für eine Primärschlüsselspalte in SQLite ist die Verwendung des INTEGER PRIMARY KEY wie hier beschrieben: Ссылка es gibt die beste Leistung (es ist schon da als die rowid Spalte, es ist nur Aliasing).

Fazit

Um Ihre Frage zu beantworten: Ja, es beeinflusst die Leistung schlecht. Vor allem aber wird es sehr schwierig sein, Ihre Tabellen gut zu verwalten. Verwenden Sie INTEGER PRIMARY KEY , es ist wirklich das beste, garantiert einzigartig und ist unglaublich schnell.

    
Abel 13.10.2009 20:52
quelle
0

Ich denke, AIEE und wenn ich Sie wäre, würde ich GUIDs in einem Integer-Typen auf SQLITE (SQLITE INTEGER ist 64 Bit) speichern.

Aber in diesem Fall könnte Blob tatsächlich besser funktionieren.

LFSR ist richtig, profilieren Sie es.

    
Joshua 13.10.2009 20:35
quelle

Tags und Links