2010-09-30 9 views
5

So haben wir einige Entwickler, die ein wenig Aussicht glücklich ging. Jetzt haben wir Ansichten, die Ansichten referenzieren, die auf Ansichten verweisen, ad nauseuse.View Erweiterung in Oracle

Also, was ich will, um mich beim Tuning zu unterstützen, ist diese Ansichten zu erweitern.

Ich möchte eine Funktion, die eine Zeichenfolge und eine Zeichenfolge zurückgibt. Die Eingabezeichenfolge ist die Abfrage, die Ausgabezeichenfolge ist dieselbe Abfrage ohne Ansichten.

CREATE OR REPLACE VIEW myView AS 
SELECT * FROM emp 

Mit der Funktion/Stored Procedure "F":

F('SELECT * FROM myView') 

... zurückkehren würde:

SELECT * FROM (SELECT * FROM emp) 

  1. Gibt es eine Oracle-Paket für das?
  2. Hat jemand Code in:
    1. entweder SQL oder PL/SQL
    2. In etwas anderes
+0

Gibt es eine Ansicht Namenskonvention, um mit dem Wahnsinn zu gehen? –

+0

'SELECT dv.TEXT_LENGTH FROM DBA_VIEWS dv WHERE dv.view_name = 'myview'' wird die Ansichtsdefinition zurückgeben. Der lustige Teil ist zu wissen, was eine Ansicht ist und was nicht in der Abfrage ist, an den verschiedenen Stellen, an denen sie auftreten kann. –

+0

Namenskonvention, ja, aber streng befolgt nein. –

Antwort

3

Ein Problem, mit dem, was Sie vorschlagen, ist, dass Es gibt in der Regel mehrere Möglichkeiten, wie eine Abfrage mit Sichten umgeschrieben werden kann. Wenn Sie also den Text der Sichten einfach erweitern, erfahren Sie nicht unbedingt, wie die Abfrage ausgeführt wird.

Da Ihr Zweck ist Tuning, würde ich vorschlagen, dass die Ausführungspläne für die Abfragen wird Ihnen wahrscheinlich die Informationen, die Sie wirklich brauchen. Dies zeigt die umgeschriebene Abfrage nicht an, aber es zeigt Ihnen alle tatsächlichen Tabellen und wie sie beim Ausführen der Abfrage referenziert werden.

Der beste Weg, die ich kenne, die tatsächlichen Ausführungsplan zu sehen ist:

SELECT /*+ gather_plan_statistics */ * FROM myView 

select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')) 
+0

Du verstehst nicht. Ich interessiere mich nicht für das Abrufen des Ausführungsplans ... Ich möchte das tatsächliche SQL ... und es gibt nur eine Möglichkeit, wie eine Ansicht geschrieben wird. Es ist keine Mehrfachauswahl ... CREATE VIEW myView AS SELECT * FROM Tabelle. Wenn ich in myView übergeben habe, möchte ich "SELECT * FROM table" als Rückgabewert. –

+0

Ich verstehe, dass ich deine Frage nicht direkt beantwortet habe. Da jemand bereits darauf hingewiesen hat, dass die Antwort auf Ihre spezifische Frage einfach "Nein" ist, habe ich versucht, eine Alternative vorzuschlagen, die hilfreich sein könnte. Mein Punkt zum Neuschreiben ist, dass, wenn Sie Interesse an der Optimierung von Abfragen haben, meine Erfahrung darin besteht, dass das einfache Erweitern des Ansichtstextes von begrenztem Nutzen ist und dass das Verstehen der tatsächlichen Ausführung der Abfrage viel nützlicher ist. –

1

einige Methoden Es gibt Ansichten zu erweitern, aber der Ausgang ist so hässlich es nicht sinnvoll sein kann.

12c Hat eine neue Prozedur namens DBMS_UTILITY.EXPAND_SQL_TEXT.

11g Hat eine undokumentierte Prozedur dbms_sql2.expand_sql_text.

Unten ist ein einfaches Beispiel. Die Ausgabe kann für das Optimierungsprogramm hilfreich sein, ist aber wahrscheinlich nicht hilfreich, wenn Sie eine lesbare SQL-Anweisung benötigen.

create or replace view view1 as select 1 a, 2 b from dual; 
create or replace view view2 as select a from view1; 

declare 
    v_output clob; 
begin 
    dbms_utility.expand_sql_text('select * from view2', v_output); 
    dbms_output.put_line(v_output); 
end; 
/

Output: 
SELECT "A1"."A" "A" FROM (SELECT "A2"."A" "A" FROM (SELECT 1 "A",2 "B" FROM "SYS"."DUAL" "A3") "A2") "A1" 
+0

du schlägst mich dazu :) –