2016-06-07 9 views
0

Ich habe eine einfache Tabelle "Tags" mit einem Schlüssel und einem Wert Spalte. Der Schlüssel ist immer ein String, der Wert kann entweder string, int64 oder ein doppelter Wert sein.SQLite Index Verwendung mit unterschiedlichen Typ Affinität

Ich habe an dieser Stelle keine echten Daten zum Testen mit. Aber ich bin neugierig auf die Indexnutzung der Spalte Wert. Ich habe die Spalte als TEXT-Typ definiert - kann SQLite immer noch den Index für die value-Spalte verwenden, wenn ein int64- oder double-Typ an die Anweisung gebunden ist? Hier

ist die Testtabelle:

CREATE TABLE "tags" ("key" TEXT,"value" TEXT DEFAULT (null)); 
INSERT INTO "tags" VALUES('test','test'); 
INSERT INTO "tags" VALUES('testint','1'); 
INSERT INTO "tags" VALUES('testdouble','2.0'); 

Ich sehe zusätzlich "Integer" und "Affinity" Einträge bei der Analyse der Abfrage über:

explain SELECT value FROM tags where key = "testint" and value >= 1 

Aber ich sehe keinen Unterschied in Index Nutzung sonst (zB idxgt wird immer benutzt). Aber ich möchte lieber eine eindeutige Antwort haben, anstatt mich bei den kleinen Testdaten auf eine falsche Annahme zu verlassen.

Antwort

1

The documentation sagt:

Eine Säule mit Geschäften TEXT Affinität alle Datenspeicherklassen NULL, TEXT oder BLOB verwenden. Wenn numerische Daten in eine Spalte mit TEXT-Affinität eingefügt werden, werden sie vor dem Speichern in Textform umgewandelt.

Die Sortierreihenfolge ist well-defined für alle Typen. Die Affinität zu TEXT zu erzwingen, bewirkt, dass sich Vergleiche in dieser Spalte mit Zahlen so verhalten, als wären die Werte Text, aber das ist wahrscheinlich das, was Sie wollen.

In jedem Fall ändern Indizes das Verhalten nicht; Sie arbeiten mit allen Typen korrekt und wenden Affinitäten genauso an wie nicht indizierte Spalten.

+0

Worüber ich wahrscheinlich nicht klar genug war: Abgesehen davon, dass ich numerische Werte speichere, und die Sie beim Speichern korrekt in Text konvertieren, muss ich tatsächlich nach numerischen * und * Textwerten fragen. Ein Textindex würde die folgenden Zeichenfolgen auf diese Weise anordnen: "1", "20", "3". Ein numerischer Index würde es 1, 3 20 ordnen. Obwohl die Frage noch bleibt, ob SQLite noch teilweise einen Index verwenden wird, wenn man sagt, "nach ganzen Zahlen abfragend mit ganzen Zahlen, die in einer Textspalte gespeichert werden.". Die offensichtliche Problemumgehung wäre, drei Felder für jeden Typ zu verwenden - aber ich würde es lieber vermeiden, wenn ich kann. – benjist

+0

Wie gesagt, Indizes funktionieren mit allen Typen korrekt. –

+0

Dies ist die richtige Antwort auf die Frage, die ich gestellt habe, obwohl es in meinem Fall einen Haken gibt (ich erwähnte die Notwendigkeit, das Ergebnis in meiner Frage anzuordnen): Man muss den Wert in eine Ganzzahl umwandeln, um eine numerische Reihenfolge zu erhalten - Das kann teuer sein, wenn viele große Zahlen zwischen den Resultsets liegen. Und dies erfordert auch die Verwendung von externer Sortierung und Speicherung. Zum Beispiel ist das Folgende teurer aufgrund der erforderlichen externen Sortierung und Suche zwischen reults: explain SELECT value FROM Tags wo key = "test" und value> = 1 order by cast (Wert als Integer) – benjist

Verwandte Themen