Vorbehalte für die Verwendung von pipelinierten Tabellenfunktionen in Oracle, um die parametrisierte Ansichtsfunktionalität zu implementieren?

StackOverflow https://stackoverflow.com/questions/5980889

Frage

Wir haben eine Entscheidung getroffen, einige "parametrierte Ansichten" über einige regelmäßige Ansichten in Oracle zu schaben, um korrekt zu fördern, wo Prädikate immer in den Abfragen verwendet werden sollen.

Der Großteil des wiederholenden Codes (angemessen angemessen angeordneten Tabellen) ist in der Ansicht, so dass wir nicht mehr viele verschiedene Verfahren und Funktionen mit ihren eigenen Kopien gemeinsamer Joins und Filter haben.

Dann schreibt wir Pipelined-Tabellenfunktionen über diesen Ansichten, um sicherzustellen, dass Anrufer die erforderlichen Filter bereitstellen, so dass die Ansichten nicht als "für alle Zeit- und Speicherplatz" bezeichnet werden. Ich habe Alternativen mithilfe von SYS_CONTEXT- und Userenv- und Paketvariablen angesehen, und obwohl sie sein scheinen, welche Oracle-Benutzer parametrierte Ansichten anrufen, sind sie einfach nicht dabei, dass jedes Mal, dass sie jedes Mal, wenn sie verwendet werden, und sie sind nicht wiederverwendbar Selbstverbindungen.

Ich habe viel darüber gelesen, einschließlich Stackoverflow:

Tischbewertungen in Oracle 11G? (parametrierte Ansichten)

Datenbank: Pipeline-Funktionen

verwendet eine Auswahl innen Eine Pipeline-PL / SQL-Tabellenfunktion erlaubt?

Dies ist eine architektonische Entscheidung, zu versuchen, die Wartbarkeit eines Antrags zu verbessern, der mit vielen wiederholten Abfragen ausgestreckt wurde. Ansichten würden auf einen Weg gehen, um zu helfen, aber ich mache mir Sorgen, dass wir keine Möglichkeit haben, Prädikate auf Anrufer durchzusetzen, um sie daran zu stoppen, dumme Dinge zu tun.

Ich hatte viel Erfolg mit dieser Technik in SQL Server mit Inline-Tischbewertungsfunktionen, und es hat wirklich dazu beigetragen, dass das System viel kohärenter und leichter, Abhängigkeiten und Auswirkungen der vorgeschlagenen Änderungen zu verfolgen, da es eine gab ) weniger Code und b) mehr Wiederverwendung und weniger Wiederholung.

Ich bin ein bisschen besorgt über diesen letzten Link, es scheint zu deuten, dass ich möglicherweise Parallelz- oder Timing-Probleme haben könnte, wenn ich einer dieser pipelinierten Tabellenfunktionen anschließen sollte, und verwenden Sie sie, um eine andere Tabelle zu aktualisieren.

Bitte teilen Sie Ihre Erfahrungen mit Pipelined Table-Funktionen und worauf ich nachsehen muss? Wenn es auch eine bessere Alternative gibt, lassen Sie mich auch in Ihrer Antwort wissen?

War es hilfreich?

Lösung

Ja, das Punkt-in-Zeit-Verhalten von Abfragen einer Tabelle innerhalb einer Pipelined-Funktion unterscheidet sich von der der Abfrage der Tabelle direkt oder über eine Ansicht, so dass sie berücksichtigt werden müssen. Das heißt, es ist normalerweise kein Problem, wenn die Pipelined-Funktion eine selten aktualisierte Tabelle abfragt. Ich kann jedoch keine Parallelitäts- oder Timing-Probleme vorstellen.

Mein Hauptproblem bei der Bereitstellung von Pipelined-Funktionen für Entwickler, die (im Gegensatz zur Verwendung von Ansichten), ist, dass sie (wie einige Ansichten) leicht missbraucht werden können. Entwickler können sich dafür entscheiden, die Ergebnisse einer Pipelined-Funktion an einem anderen anzuschließen, was zu sehr ineffizienten Abfragen führt, die nicht von Indizes wie Indizes, gestoßenen Prädikaten und Tabelleneinschränkungen nutzen können.

Wenn Wartungsfähigkeit Ihr Hauptproblem ist, würde ich Ansichten bevorzugen - sie können dazu beitragen, doppeltes Code zu reduzieren, indem sie gemeinsame Transformationen an einem Ort definieren, und vielleicht auch gemeinsame Joins; Auch diese sind jedoch zu leicht missbraucht (z. B. verbindet sich zu einer Ansicht, obwohl es zu einem anderen Tisch verbunden ist, der nicht von der ursprünglichen Abfrage erforderlich ist).

Leistung und Effizienz, werden wahrscheinlich die Dinge sein, auf die Sie nicht sehen können. Setzen Sie ein strenges Review-Regime für alle SQL in der Anwendung, um nach schlecht schriftlichen oder inkonsistenten Abfragen zu suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top