2010-09-30 15 views
5

Así que tenemos algunos desarrolladores que fueron un poco felices. Entonces ahora tenemos vistas que hacen referencia a las vistas de referencia, ad nauseum.Ver expansión en Oracle

Así que lo que quiero, para ayudarme en Tuning, es expandir estas vistas.

Quiero una función que toma una cadena y devuelve una cadena. La cadena de entrada es la consulta, la cadena de salida es la misma consulta sin vistas.

CREATE OR REPLACE VIEW myView AS 
SELECT * FROM emp 

Usando la función/procedimiento almacenado "F":

F('SELECT * FROM myView') 

... volvería:

SELECT * FROM (SELECT * FROM emp) 

  1. ¿Hay un paquete de Oracle para esto?
  2. ¿Alguien tiene el código en:
    1. ya sea SQL o PL/SQL
    2. En algo más
+0

¿Existe una convención de nomenclatura de vistas que coincida con la locura? –

+0

'SELECCIONE dv.TEXT_LENGTH DESDE DBA_VIEWS dv WHERE dv.view_name = 'myview'' devolverá la definición de la vista. La parte divertida es saber qué es una vista y qué no está en la consulta, en los distintos lugares donde puede ocurrir. –

+0

convención de nomenclatura, sí, pero siguió estrictamente no. –

Respuesta

3

Un problema con lo que usted propone es que Por lo general, hay varias maneras de reescribir una consulta que involucre vistas, de modo que simplemente expandir el texto de las vistas no necesariamente le dirá mucho acerca de cómo se está ejecutando la consulta.

Como su propósito es el ajuste, le sugiero que los planes de ejecución de las consultas probablemente le den la información que realmente necesita. Esto no mostrará la consulta reescrita, pero le mostrará todas las tablas reales y cómo se referencian al ejecutar la consulta.

La mejor manera que conozco para ver el plan de ejecución real es:

SELECT /*+ gather_plan_statistics */ * FROM myView 

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

No entiendes. No me importa recuperar el plan de ejecución ... Quiero el SQL real ... y solo hay una forma de escribir una vista. No es una opción múltiple ... CREAR VIEW myView AS SELECT * FROM table. Si pasé en myView, quiero "SELECT * FROM table" como valor de retorno. –

+0

Entiendo que no respondí su pregunta directamente. Como alguien ya había señalado que la respuesta a su pregunta específica es simplemente "no", estaba intentando sugerir una alternativa que podría ser útil. Lo que quiero decir sobre la reescritura es que si su interés está en sintonizar las consultas, mi experiencia es que simplemente expandir el texto de la vista tiene una utilidad limitada y que la comprensión de la ejecución real de la consulta es mucho más útil. –

1

Hay algunos métodos para expandir puntos de vista, pero la salida es tan feo que puede no ser útil.

12c Tiene un nuevo procedimiento llamado DBMS_UTILITY.EXPAND_SQL_TEXT.

11g Tiene un procedimiento no documentado dbms_sql2.expand_sql_text.

A continuación se muestra un ejemplo simple. El resultado puede ser útil para el optimizador, pero probablemente no sea de mucha utilidad si necesita una declaración SQL legible por humanos.

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

me ganaste :) –

Cuestiones relacionadas