2017-08-16 3 views
0

Ich habe zwei Tabellen tool_attribute. Werkzeug hat 12 Spalten und tool_attribute hat 5.sqlite Optimierung auf innerem Join mit Tabellenwerten um 18K

Informationen i aus den Tabellen benötigt:

  1. Werkzeug - refid, seriell, Typ, ID
  2. tool_attribute - Schlüssel, Wert, id (Es wird i im Werkzeug- und 255.696 in tool_attribute rechts mehrere Einträge für diese)

jetzt haben rund 18.264

Aktuelle Abfrage:

select 
    tool.refid, 
    tool.serial, 
    tool_attribute.value, 
tool.type 
from tool 
inner join tool_attribute 
    on tool.id = tool_attribute.id 
where 
    (tool_attribute.val LIKE '%t00%' or 
    tool.serial LIKE '%t00%') 
group by tool.refid 
order by tool.serial asc; 

Dies dauert etwa 750 ms, die ziemlich schnell ist, aber ich will es viel schneller machen. Ich führe diesen Code auf Low-Memory-Windows 6.0-Gerät, so dass es zu viel Zeit in Anspruch nimmt. Gibt es eine Möglichkeit, es schneller zu machen?

+0

Was ist das 't00'? Wenn es sich um eine wichtige Information handelt, könnte es sich lohnen, sie in eine eigene Spalte zu stellen. –

+0

Nein, es ist nur ein Beispieltext. Es kann variieren – user3383301

Antwort

0

Sie können versuchen, in der Join beteiligten Indizes zu den Spalten hinzufügen:

CREATE INDEX idx_tool ON tool (id); 
CREATE INDEX idx_tool_attr ON tool_attribute (id); 

Die LIKE Bedingungen in Ihrer WHERE Klausel ausschließen würde jede Chance mit Hilfe eines Index für die Spalten beteiligt, glaube ich. Der Grund dafür ist ein LIKE Ausdruck der Form %something eliminiert die Möglichkeit, einen B-Baum zu durchsuchen, der das Suffix von links nach rechts verwendet, um etwas zu finden. Wenn Sie Ihre WHERE Logik mit etwas ähnlich wie LIKE 'something%' umformulieren könnten, könnte dort auch ein Index verwendet werden.

+0

Das Problem ist, dass ich Index nicht verwenden kann. Die ID in tool_attribute enthält doppelte Werte. – user3383301

+0

@ user3383301 Sie können immer noch einen Index für eine Spalte mit doppelten Werten verwenden. Solange Sie nicht wirklich niedrige Kardinalität haben, sollten Sie in Ordnung sein. –

Verwandte Themen