Oracle - Query de funcion a vista (costo)

 
Vista:
sin imagen de perfil
Val: 5
Ha disminuido 1 puesto en Oracle (en relación al último mes)
Gráfica de Oracle

Query de funcion a vista (costo)

Publicado por Fernando (3 intervenciones) el 20/06/2019 19:19:03
Buena tarde.

Les comento el problema que tengo en oracle 12c

Actualmente tengo una funcion que regresa un cursor, en la funcion tengo un query el cual es rapido y tiene muy poco costo, lo que quiero hacer es llevar ese query a una vista ya que será usado en otros procesos.

La diferencia esta en donde se ponen los filtros y es algo asi

query actual (usado por la funcion)

(
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH UNIV AS(
                            select  *
                                from  tabla1  dc
                                 join tabla2  RL  on dc .col= rl .col
                                 join tabla3  drl ON RL .col= DRL.col
                                 join tabla4  lot on lot.col= DRL.col
                                    WHERE 1=1
                                        tabla1.filtro=&filtro
 
            )
 
     SELECT *
         FROM UNIV U
          left join tabla6 ruc on ruc.coln=U.col2
          left join tabla6 doc on doc.coln=U.col2
)
Como podemos ver, el filtro se encuengtra en el primer subquery (univ) y la respuesta es rapida
Ahora para poder hacer la vista el filtro lo saco de ese subquery y lo pongo hasta el ultimo nivel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WITH UNIV AS(
                            select  *
                                from  tabla1  dc
                                 join tabla2  RL  on dc .col= rl .col
                                 join tabla3  drl ON RL .col= DRL.col
                                 join tabla4  lot on lot.col= DRL.col
                                    WHERE 1=1
 
 
            )
 
     SELECT *
         FROM UNIV U
          left join tabla6 ruc on ruc.coln=U.col2
          left join tabla6 doc on doc.coln=U.col2
       where u.filtro =&filtro ;
y con ese cambio el tiempo de ejecucion y el costo eleva a mas de 1000% no se si me puedan orientar para que el query siga siendo rapido.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Query de funcion a vista (costo)

Publicado por Rafael (328 intervenciones) el 25/06/2019 14:25:09
Has probado sin el WITH

Vaya ya que no estas totalizando nada ni materializando la consulta del WITH veo que no tiene sentido el usarlo...

1
2
3
4
5
6
7
8
SELECT *
FROM tabla1  dc
       join tabla2  RL  on dc .col= rl .col
       join tabla3  drl ON RL .col= DRL.col
       left join tabla6 ruc on ruc.coln=U.col2
       left join tabla6 doc on doc.coln=U.col2
where dc.filtro =&filtro
;

Ahora por que digo que no tiene sentido ...

La documentacion oficial dice:
https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702

with_clause
Use the with_clause to define the following:
PL/SQL procedures and functions (using the plsql_declarations clause)
Subquery blocks (using the subquery_factoring_clause)


No estas definiendo procedures ni funciones... no cumples esto ...
Subquery blocks ...

subquery_factoring_clause

The subquery_factoring_clause lets you assign a name (query_name) to a subquery block. You can then reference the subquery block multiple places in the query by specifying query_name. Oracle Database optimizes the query by treating the query_name as either an inline view or as a temporary table. The query_name is subject to the same naming conventions and restrictions as database schema objects. Refer to "Database Object Naming Rules" for information on database object names.

The column aliases following the query_name and the set operators separating multiple subqueries in the AS clause are valid and required for recursive subquery factoring. The search_clause and cycle_clause are valid only for recursive subquery factoring but are not required. See "Recursive Subquery Factoring".

You can specify this clause in any top-level SELECT statement and in most types of subqueries. The query name is visible to the main query and to all subsequent subqueries. For recursive subquery factoring, the query name is even visible to the subquery that defines the query name itself.

NO lo usas de forma recursiva, NO lo usas en multiples sitios, que sentido tiene? NINGUNO...

Ya me contaras como te va con lo que te propongo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha disminuido 1 puesto en Oracle (en relación al último mes)
Gráfica de Oracle

Query de funcion a vista (costo)

Publicado por Fernando (3 intervenciones) el 25/06/2019 21:37:43
Muchas gracias por contestar Rafael.

Todo lo que dices tiene sentido y razon, puse ese ejemplo un poco burdo con solo un qubuery por que es basicamente lo que pasa, uso un with el cual tengo varias subconsultas y donde el filtro esta en el primer quebquery (univ) posteriormente ese universo se va reutilizando en los demás subquerys.

Lo que busco es sacar ese filtro del subquery principal y pasarlo hasta abajo para poder usarlo en una vista.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Query de funcion a vista (costo)

Publicado por Rafael (328 intervenciones) el 26/06/2019 13:12:37
Pues si la pregunta no es la indicada la respuesta no puede ser la indicada....

Es decir ... para aconsejarte otra cosa deberia poder ver la consulta REAL...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha disminuido 1 puesto en Oracle (en relación al último mes)
Gráfica de Oracle

Query de funcion a vista (costo)

Publicado por Fernando (3 intervenciones) el 27/06/2019 19:26:48
Que tal Rafael.

Nuevamente gracias por responder.

El problema es el sacar el filtro del subquery al query externo, no puse el query completo por que es algo largo pero el problema esta claro al inicio donde muestro lo que tengo (de forma burda) a lo que se queire llegar, lo que busco es un camino generico y no particular ya que este problema lo tenemos en varios querys.
No se si me puedan ayudar con lluvia de ideas, formas, pruebas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar