2010-09-30 6 views
5

Quindi abbiamo alcuni sviluppatori che hanno fatto una piccola visione felice. Quindi ora abbiamo le viste che fanno riferimento alle viste che fanno riferimento alle viste, fino alla nausea.Visualizza l'espansione in Oracle

Quindi quello che voglio, per aiutarmi in Tuning, è espandere queste visualizzazioni.

Desidero una funzione che accetta una stringa e restituisce una stringa. La stringa di input è la query, la stringa di output è la stessa query senza visualizzazioni.

CREATE OR REPLACE VIEW myView AS 
SELECT * FROM emp 

Utilizzando la funzione/stored procedure "F":

F('SELECT * FROM myView') 

... sarebbero tornati:

SELECT * FROM (SELECT * FROM emp) 

  1. Esiste un pacchetto di Oracle per questo?
  2. Qualcuno ha il codice in:
    1. sia SQL o PL/SQL
    2. In qualcos'altro
+0

C'è una convenzione di denominazione di vista per andare d'accordo con la follia? –

+0

'SELECT dv.TEXT_LENGTH FROM DBA_VIEWS dv WHERE dv.view_name = 'myview'' restituirà la definizione della vista. La parte divertente è sapere cosa è una vista e cosa non è presente nella query, nei vari punti in cui si può verificare. –

+0

Convenzione di denominazione, sì, ma rigorosamente seguita no. –

risposta

3

Un problema con quello che lei propone è che di solito ci sono molti modi in cui una query che coinvolge le viste può essere riscritta, quindi semplicemente espandere il testo delle viste non ti dirà molto sul modo in cui la query viene eseguita.

Poiché il tuo scopo è l'ottimizzazione, suggerirei che i piani di esecuzione per le query probabilmente ti forniranno le informazioni di cui hai veramente bisogno. Questo non mostrerà la query riscritta, ma mostrerà tutte le tabelle attuali e il modo in cui vengono referenziate nell'esecuzione della query.

Il modo migliore che conosco per visualizzare il piano di esecuzione reale è:

SELECT /*+ gather_plan_statistics */ * FROM myView 

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

Non stai capendo. Non mi interessa il recupero del piano di esecuzione ... Voglio l'attuale SQL ... e c'è solo un modo per scrivere una vista. Non è una scelta multipla ... CREATE VIEW myView AS SELECT * FROM table. Se ho passato in myView voglio "SELECT * FROM table" come valore di ritorno. –

+0

Capisco che non ho risposto direttamente alla tua domanda. Dal momento che qualcuno aveva già sottolineato che la risposta alla tua domanda specifica è semplicemente "no", stavo cercando di suggerire un'alternativa che potrebbe essere utile. Il mio punto sulla riscrittura è che se il vostro interesse è nelle query di ottimizzazione, la mia esperienza è che semplicemente espandere il testo della vista è di utilità limitata e che la comprensione dell'esecuzione effettiva della query è molto più utile. –

1

ci sono alcuni metodi per espandere vista ma l'uscita è così brutto che non può essere utile.

12c Ha una nuova procedura denominata DBMS_UTILITY.EXPAND_SQL_TEXT.

11g Ha una procedura non documentata dbms_sql2.expand_sql_text.

Di seguito è riportato un semplice esempio. L'output può essere utile per l'ottimizzatore, ma probabilmente non è molto utile se hai bisogno di una dichiarazione SQL leggibile.

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

mi hai battuto :) –