Datenbankleistung der Ansicht gegenüber der neuen Tabelle

8

Ich verwende eine Oracle-Datenbank, die aufgrund von Joins in einigen Tabellen nur langsam arbeitet, um Ergebnisse zu erhalten. Ich überlege, eine neue Tabelle zu erstellen, die einige dieser Daten speichert, so dass sie schnell abgerufen werden können, ohne die Joins durchführen zu müssen. Eine andere Alternative besteht darin, eine Ansicht für die von mir ausgeführten Joins zu erstellen und dann immer die Ansicht für die Daten abzufragen. Was ist der Leistungsunterschied zwischen der Verwendung einer neuen Tabelle und dem Erstellen einer Ansicht? Ich nahm an, dass eine Ansicht den Join weiterhin ausführen müsste, damit sie nicht so gut funktioniert wie eine neue Tabelle.

Informationen zur Oracle-Datenbankansicht finden Sie hier:     - Ссылка     - Was ist eine Ansicht in Oracle?

Klärung basierend auf den Antworten unten. Die Abfragen sind meistens bereits optimiert, daher möchte ich keine Optimierung vornehmen. Würde entweder eine neue Tabelle oder eine materialisierte Ansicht bevorzugen, würde aber gerne wissen, welche besser sein könnte. Ich bin an Leistung interessiert. Das Schreiben von mehr Code, um die neue Tabelle mit den alten Tabellen synchron zu halten, ist kein Problem. Ich werde Modifizierungsanweisungen nur dort hinzufügen, wo Änderungen an alten Tabellen vorgenommen wurden. Ich möchte keine materialisierte Ansicht verwenden, wenn sie langsamer ist als das Hinzufügen einer neuen Tabelle.

Der Unterschied besteht darin, ob die Aktualisierung der Daten für die materialisierte Ansicht oder für eine neue Tabelle effizienter ist. Für die neue Tabelle werde ich im Grunde Update-Anweisungen hinzufügen, wo immer die alte Tabelle aktualisiert wurde. Wenn der Benutzer die neue Tabelle abfragt, sind die Daten bereits vorhanden (keine weitere Verarbeitung erforderlich). Wenn sich die Ansicht bei einer materialisierten Ansicht jedoch nur dann aktualisiert, wenn der Benutzer die Ansicht abfragt, ist dies möglicherweise langsamer.

    
john 12.03.2012, 19:02
quelle

3 Antworten

7

Eine Sicht ist nur eine gespeicherte Abfrage, daher sollte es keinen Unterschied in der Leistung zwischen dem Abfragen einer Sicht und dem Ausgeben einer identischen Abfrage für die Basistabelle geben.

Das Erstellen einer separaten Tabelle kann die Leistung von Abfragen erhöhen, aber es verstößt gegen die Normalisierung und Sie müssen dann Code schreiben, der diese Tabelle synchronisiert hält. Wenn die Abfragen das richtige Ergebnis und nicht ein ungefähres Ergebnis liefern sollen, bedeutet dies, dass Ihre DML-Vorgänge (Einfügungen, Aktualisierungen und Löschvorgänge) langsamer sind, um die Daten synchron zu halten. Dies kann ein angemessener Kompromiss sein, wenn es sich in erster Linie um eine Berichtsdatenbank handelt, aber in einer OLTP-Umgebung, in der die Transaktionsleistung von entscheidender Bedeutung ist, wird sie weniger geeignet sein.

Wenn Sie eine Tabelle erstellen, würde ich im Allgemeinen vorschlagen, dass Sie ein materialisierte Ansicht stattdessen. Das hat die Leistungsvorteile einer Tabelle, aber Oracle sorgt dafür, dass es synchron bleibt, so dass Sie nicht viel benutzerdefinierten Code dafür schreiben müssen.

Aber es ist überhaupt nicht offensichtlich, dass die Materialisierung die richtige Lösung ist. Sind Sie sicher, dass einige Indizes nicht einfach fehlen?

    
Justin Cave 12.03.2012, 19:19
quelle
5

A materialized view könnte das sein, wonach Sie suchen. Ein reguläres view existiert nicht als Tabelle, es verweist nur auf die Tabellen, auf denen es basiert. Aber, wie Linutis bemerkt hat, sollten Sie zuerst versuchen, Ihre Abfrage zu optimieren. Möglicherweise benötigen Sie Indizes für die Spalten, die am Join beteiligt sind, und Statistiken, die für die von Ihnen verwendeten Tabellen gesammelt wurden.

    
GriffeyDog 12.03.2012 19:16
quelle
5

Ansichten sind nur ein Wrapper für Abfragen, die Leistung der Verwendung einer Ansicht ist genauso wie die Leistung der Verwendung einer Abfrage (wenn Sie den Analyseaufwand für Abfragen ignorieren).

Die Verwendung einer Ansicht hilft also nicht, wenn Sie viele Joins verwenden. Aber nach viel Erfahrung in der Abfrageoptimierung in Oracle kann ich Ihnen einige Hinweise geben:

  1. Verwenden Sie eine Unterauswahl (innerhalb Ihrer Auswahlklausel) anstelle einer Verknüpfung, wenn dies möglich ist. Es gibt einige Fälle, in denen dies nicht möglich ist, oder es ist nicht gut, dies zu tun, wie zum Beispiel:
    • Wenn Sie innere Verknüpfungen verwenden, um einige Datensätze aus der Ergebnismenge zu entfernen -
    • Sie möchten einige Bedingungen für diese Spalten haben
    • Sie möchten nach diesen Spalten sortieren.
  2. Verwenden Sie union all anstelle von union , wo dies möglich ist.
  3. Verwenden Sie coalesce , wenn es richtig ist (verwenden Sie es sogar mit sub-select als Parameter),
  4. Erstellen Sie richtige Indizes (gemäß Ihrem Ausführungsplan)
  5. Vermeiden Sie die Verwendung von gespeicherten Funktionen in Ihren Join- und Where-Klauseln.

Das sind die Dinge, die mir jetzt eingefallen sind. Hoffe, es würde helfen.

    
Amir Pashazadeh 12.03.2012 19:22
quelle