2016-07-04 7 views
0

Hier ist der sqlfiddle of my example, aber lassen Sie mich erklären:Warum verwendet SQLite keinen Index, wenn ein literaler Spaltenwert in der WHERE-Klausel verwendet wird?

Wenn ich eine einfache Tabelle wie folgt aus:

CREATE TABLE ForgeRock 
    (`id` int, `productName` varchar(7), `description` varchar(55)) 
; 

Und einen einfachen Index auf der productName Spalte wie folgt aus:

CREATE INDEX test_idx ON ForgeRock(productName); 

I kann einfach Daten unter Verwendung der productName in der WHERE-Klausel auswählen und mein Index wird verwendet. Nett.

Wenn ich einen hartcodierte Wert in der Liste der Spalten hinzufügen Ich Auswahl, auch es funktioniert gut und der Index verwendet wird, auch:

SELECT 
    0 as foo, 
    0 as bar, 
    productName, 
    description 
FROM 
    ForgeRock 
WHERE (foo = 0 AND productName IN ('OpenIDM', 'OpenDJ')) 

Selbst die hartcodierte foo Spalt in Die WHERE-Klausel verwendet immer noch den Index (wie es sollte). Aber hier ist meine Frage: Warum wird der Index NICHT verwendet, wenn ich OR (foo = 1 AND bar IN (1)) der WHERE-Klausel hinzufüge?

SELECT 
    0 as foo, 
    0 as bar, 
    productName, 
    description 
FROM 
    ForgeRock 
WHERE (foo = 0 AND productName IN ('OpenIDM', 'OpenDJ')) OR (foo = 1 AND bar IN (1)); 

Jede Hilfe wäre willkommen. Noch einmal, here's the sqlfiddle.

Antwort

0

Die documentation sagt:

WHERE-Klausel Einschränkungen, die durch verbunden sind oder an deren Stelle und kann behandelt werden [...]
Für jede gegebene Abfrage, die Tatsache, dass die OR-Klausel Optimierung hier beschrieben kann verwendet werden garantiert nicht, dass es verwendet wird. SQLite verwendet einen kostenbasierten Abfrageplaner, der die CPU- und Festplatten-I/O-Kosten verschiedener konkurrierender Abfragepläne schätzt und den Plan auswählt, der seiner Meinung nach am schnellsten ist. Wenn in der WHERE-Klausel viele ODER-Ausdrücke vorhanden sind oder wenn einige der Indizes für einzelne OR-Klausel-Unterbegriffe nicht sehr selektiv sind, könnte SQLite entscheiden, dass es schneller ist, einen anderen Abfragealgorithmus oder sogar einen vollständigen Tabellenscan zu verwenden.

Verwandte Themen