2017-09-28 6 views
1

Ich führe SQL-Anfragen auf Tabelle interim_19 mit 67.500 Zeilen. Tabelle ist nicht indiziert und hat 7 Spalten, von denen keine eindeutige/Primärschlüssel sind, weil Hauptdaten Abonent und idBase wiederholen, unter allen Daten habe ich wie 7-8 verschiedene idBases und ~ 10.000 verschiedene Abonents, und die anderen Daten mögen date ist nicht zuverlässig in Bezug auf die Einzigartigkeit.Slow SQL INNER JOIN

Das Problem besteht in langsamen inneren Joins auf dieser Tabelle.

Und wenn ich SELECT * FROM interim_19 WHERE idBase IN (1551 , 42286) ausführen es 1,33 Sekunden dauern werde, und SELECT * FROM interim_19 WHERE idBase IN (1535 , 5406) 1,9 Sekunden dauern wird, ob

SELECT * FROM (SELECT * FROM interim_19 WHERE idBase IN (1551 , 42286)) 
temp1 
inner join 
(SELECT * FROM interim_19 WHERE idBase IN (1535 , 5406)) temp2 
on temp1.Abonent = temp2.Abonent 

dauert ewig - 147-157 Sekunden. Ich verstehe, dass innerer Join jede Zeile mit jeder zweiten Zeile der zweiten Tabelle vergleicht, aber das sollte nicht so lange dauern. OFC es macht Duplikate, aber ich brauche alle 7 + 7 Zeilen, also ...

P.S Ich versuche bereits, es zu indizieren, so dass andere Ratschläge auch willkommen sind.

+0

Ich sehe keinen Grund für die abgeleiteten Tabellen und verbindet die Tabellen direkt. Wählen Sie außerdem nur die Spalten aus, die Sie tatsächlich benötigen. "SELECT *" tut dir keinen Gefallen. –

+0

Ist es mySQL oder SQL Server? Bitte editiere deine Tags –

Antwort

2

In der ‚Composite‘ INDEX(idBase, Abonent)

(Und, wie andere darauf hin, Verwenden Sie eine JOIN, keine Unterabfrage.)

Ein INDEX muss nicht "eindeutig" sein.

147 Sekunden war, weil die Unterabfragen durchgeführt wurden viele mal, jedes Mal auf 67K Reihen. Ich denke, mein Index, oben, wird allen bisher erwähnten Anfragen helfen.

+0

Danke, Index auf zwei Elemente hinzugefügt verbesserte es von 147 Sekunden auf 0,8. – upicik

2

versuchen, diese unnötigen Subqueries beseitigen:

SELECT * 
FROM interim_19 t1 
INNER JOIN interim_19 t2 
    ON t1.Abonent = t2.Abonent 
WHERE 
    t1.idBase IN (1551 , 4228) AND 
    t2.idBase IN (1535 , 5406) 

Darüber hinaus können Sie einen Index Zugabe auf den idBase Spalt betrachten. Und wie in den Kommentaren vorgeschlagen, könnten Sie auch versuchen, Ihre Auswahlliste einzuschränken.

+0

Was ist, wenn ich eine andere IDBase zum Vergleichen habe, wie ich hier einen weiteren inneren Join hinzufüge? – upicik

+0

Wenn Sie eine andere Frage haben, möchten Sie vielleicht eine neue Frage stellen, anstatt Ihre aktuelle zu ändern. –

+0

NEIN, ich meine, ich möchte dieser Abfrage einen weiteren Join hinzufügen. Sollte es sein: 'SELECT * VON interim_19 t1 INNERER JOIN Interim_19 t2 ON t1.Abbinder = t2.Abbinder INNER JOIN Interim_19 t3 ON t3.Abbinder = t2.Abbund WHERE t1.idBase IN (1551, 4228) UND t2.idBase IN (1535, 5406) ​​UND t3.idBase IN (29551618) ' – upicik

2

Unterabfragen haben keine Indizes. Versuchen Sie, sie so lange zu vermeiden, wie es möglich ist:

SELECT * 
FROM interim_19 t1 
INNER JOIN interim_19 t2 
    ON (t1.Abonent = t2.Abonent AND t2.idBase IN (1535 , 5406)) 
WHERE 
    t1.idBase IN (1551 , 4228) 

ein bisschen schneller als Tim Antwort sein ...

+0

Was ist, wenn ich eine andere IDBase zum Vergleichen bekomme, wie ich hier einen weiteren inneren Join hinzufüge? – upicik