2017-10-18 3 views
0

Langsame SQL-Abfrage, wenn zwei Tabellen verbinden, eine Möglichkeit, die Abfragegeschwindigkeit zu verbessern?Verlangsamen Sie die SQL-Abfrage, wenn Sie zwei Tabellen verbinden, um die Abfragegeschwindigkeit zu verbessern?

Ich habe eine kleine Tabelle A und große Tabelle B. A hat alle Spalten, die wir brauchen, außer TYPE-Spalte, und der TYPE-Wert kann nur in B gefunden werden. Aber B haben zu viele nutzlose Zeilen.

Jetzt möchte ich alle Zeilen von A auswählen, und sie sollten alle Spalten plus TYPE haben. Meine Idee ist die Verwendung linker Verknüpfungen, da sie alle Zeilen von B auswählen kann, die in A existieren, so dass wir den TYPE-Wert erhalten können.

Oracle:

SELECT B.HOUR, B.LOCATION, B.PRICE, B.TYPE, B.DATE 
FROM A LEFT JOIN B 
ON A.HOUR=B.HOUR AND A.LOCATION=B.LOCATION AND A.PRICE=B.PRICE AND A.DATE=B.DATE 

Es ist sehr langsam. Außerdem habe ich nur Leseberechtigung, so dass ich keine neue Tabelle erstellen kann. Gibt es eine Methode, um es zu verbessern? Vielen Dank.

+1

Tabellen- und Indexdefinitionen bitte wert sein. – jarlh

+0

Stellen Sie sicher, dass alle Spalten in Ihrer ON-Klausel indiziert sind. – SEarle1986

+2

Ohne irgendwelche Privilegien, aber lesen Sie, Sie können nicht viel tun. – jarlh

Antwort

1

Ohne die tatsächlichen Daten zu sehen oder Indizes in der Lage zu schreiben, etc, es ist schwer zu beraten, aber es gibt ein paar Ansätze können Sie versuchen:

a) Verwenden Sie ein Exists anstelle des JOIN

SELECT B.HOUR, B.LOCATION, B.PRICE, B.TYPE, B.DATE 
FROM B 
WHERE EXISTS (SELECT 1 FROM A 
       WHERE A.HOUR=B.HOUR AND A.LOCATION=B.LOCATION AND A.PRICE=B.PRICE AND A.DATE=B.DATE) 

b) Gruppe der größere 'B' Tisch in einem CTE oder in eine temporäre ta ble

;WITH data as (
    SELECT B.HOUR, B.LOCATION, B.PRICE, B.TYPE, B.DATE 
    FROM B 
    GROUP BY B.HOUR, B.LOCATION, B.PRICE, B.TYPE, B.DATE 
) 
SELECT Data.HOUR, Data.LOCATION, Data.PRICE, Data.TYPE, Data.DATE 
FROM Data 
      INNER JOIN A 
      ON A.HOUR=Data.HOUR AND A.LOCATION=Data.LOCATION AND A.PRICE=Data.PRICE AND A.DATE=Data.DATE 

Es ist möglich, dass weder Lösung funktionieren wird, aber sie können versuchen, eine

1

Für Ihre Abfrage möchten Sie einen Index auf b(hour, location, price, date).

Die Reihenfolge der Spalten spielt keine Rolle.

Ich denke, Ihre Abfrage geschrieben werden sollte:

SELECT a.*, b.type 
FROM A LEFT JOIN 
    B 
    ON A.HOUR = B.HOUR AND A.LOCATION = B.LOCATION AND 
     A.PRICE = B.PRICE AND A.DATE = B.DATE; 
+0

Sie empfehlen einen Platzhalter? Du weißt, dass das falsch ist. Einfach nur faul mit dem Tippen. – Hogan

1

Das Problem mit der Verbindung wird es mehrere Schlüssel zu passen ist versucht, und es keiner von ihnen sind ganze Zahlen. Anstatt zu versuchen, das zu beheben (Sie haben sowieso keine Berechtigung), verwenden Sie eine Unterabfrage.

Eine Unterabfrage nur die A Reihen nimmt und fügt die einzelne Feld in B mit den Kriterien:

SELECT A.HOUR, A.LOCATION, A.PRICE, 
     ,(SELECT TYPE 
      FROM B 
     WHERE B.HOUR = A.HOUR AND B.LOCATION = A.LOCATION 
       AND B.PRICE = A.PRICE AND B.DATE = A.DATE 
     ) AS [Type] 
     ,A.DATE 
    FROM A 
Verwandte Themen