2016-04-20 11 views
0

Oracle-Datenbank wird verwendet Es gibt SALES-Tabelle und eine Vielzahl von Dictionary-Tabellen DICT_1, DICT_2, ... DIC_N. Benutzer können SALES Tabellen (insert Update löschen) ändern und Ergebnisdaten stellen wie:Verbessern Sie die Leistung in SQL-Abfrage mit vielen RIGHT OUTER JOIN und ORDERING

SELECT 
S.ID as ID, 
RPAD(D1.NAME, 10) || LPAD(D1.NAME, 10) as NAME, 
    CASE 
     WHEN D2.count > 0 THEN 'Y' 
     ELSE 'N' 
    END 
as FLAG 
D3.FIELD as SOME_FIELD_3 
D4.FIELD as SOME_FIELD_4 
D5.FIELD as SOME_FIELD_5 

FROM SALES S, DICT_1 D1, DICT_2 D2, DICT_3 D3, DICT_4 D4, DICT_5 D5 
WHERE 
    S.D1_ID = D1.ID(+) 
AND S.D2_ID = D2.ID(+) 
AND S.D3_ID = D3.ID(+) 
AND S.D4_ID = D4.ID(+) 
AND S.D5_ID = D5.ID(+) 

ORDER BY NAME; 

So versuchen Wörterbuch zu verbinden, falls kein sutch Wörterbuch null auf den Verkauf und zusätzliches Feld von Wörterbuch Feldern und SALES zu berechnen. Oredering kann auf jedes Feld von select applated (zum Beispiel NAME, FLAG, ...). Withot Abfrage ist ziemlich schnell, aber mit Bestellleistung sinkt. Ich schlage vor, ORACLE MATERIALIZED VIEW zu verwenden, aber weil Benutzer häufig die SALES-Tabelle aktualisieren, lehnen diese Vorgehensweise ab. Könnten Sie bitte mit der Entscheidung unterstützen, wie Sie diese Abfrage mit rechter äußerer Verknüpfung verbessern und die Reihenfolge durch das berechnete Feld verbessern können.

+0

Ist das eine Art uraltes Recht Join Syntax oder? – Magnus

+0

Wechseln Sie zuerst zur modernen, expliziten Joinsyntax. Außerdem haben die meisten Leute genug Probleme mit LEFT JOIN und finden RIGHT JOIN noch verwirrender. Also, tut jedem einen Gefallen und wechselt zu LINKER JOIN! – jarlh

+0

Leider kann die Syntax die Leistung nicht beeinflussen – Alstresh

Antwort

0

Ich bin glücklich mit Ihrer Syntax. Aber ich bin in Ihrer Erklärung interessiert:

withot um durch Abfrage ist ziemlich schnell, aber mit der Leistung der Bestellung geht

mit einer ORDER BY-Klausel muss die Datenbank alle Zeilen abrufen und die Daten dann bestellen, bevor Rückgabe des Ergebnissatzes an Sie. Ohne ORDER BY kann die Datenbank Datenpakete zurückgeben, sobald sie abgerufen wurden. Die Performance für die gesamte Ergebnismenge ist fast sicher unverändert.

0

Wie Sie sagen, dass nur ORDER BY verlangsamt die SQL, ist das Problem nicht beim Abrufen von Daten, sondern beim Sortieren. Selbst wenn Sie eine materialisierte Ansicht mit vorberechneten Daten haben und die Daten jedes Mal dynamisch mit einem anderen Feld sortiert werden müssen, benötigt das SQL also Zeit.

Ein besserer Ansatz wäre 1. Diskutieren Sie mit Business/Clients, um die am häufigsten verwendeten FEW-Sortierspalten zu identifizieren. 2. Erstellen Sie Indizes für diese identifizierten Spalten. (Es müssen wenige sein oder wir werden mit einer Menge von Indizes enden, die nur für diese SQL nützlich sind) 3. Schreiben Sie SQL wie folgt um. MIT sorted_result AS (indexed_columns VON ORDER BY indexed_Columns SELECT) SELECT FROM, sorted_result WO UND sorted_result.ID = SALES.ID

Tabellenzugriff, bis das Sortieren abgeschlossen ist in der WITH-Klausel vermieden. Die äußere SQL verwendet die sortierte Ergebnismenge, um das Ergebnis in Batches/first_rows_n zu erhalten. Da nur auf den Index für Sortierungen zugegriffen wird, sollte die Abfrage schneller sein.

Hoffe, das hilft.