Consulta pesada a Oracle

MarMed
06 de Julio del 2006
Hola amigos...
Tengo un problema con una consulta sql muy extensa y pesada, que hago desde una pagina asp a una base de datos en oracle (9i)...
Cuando la hago de esa forma (desde asp) la pagina da error, es decir, no me devuelve nada, por lo que tarda...
En cambio, si a la consulta sql la ejecuto directamente en el servidor de la base de datos (a traves del sql navigator), aunque tarda una bestialidad (aproximadamente 1 minuto), me devuelve los registros...
No creo que el problema sea del hard, ya que la maquina es un pentium IV de 2 y picho GHz, y 512 MB de RAM...
Probe ampliando el timeout, desde la pagina,desde el iis y desde los odbc (la conexion la hago con un dns)...
Con la misma consulta pero mas acotada (en un rango de fechas mas corto) no tengo problema... El problema surge cuando son muchos dias...

Esta es la consulta:

select p.pid, p.name,
to_date('010606', 'DDMMYY') stime,
to_date('300606', 'DDMMYY')+1 ftime,
nvl(s.col,0) ocol,
nvl(s.dur,0) odur,
nvl(s.bdur,0) obdur,
nvl(t.col,0) tcol,
nvl(t.dur,0) tdur,
nvl(t.bdur,0) tbdur,
nvl(s.charge,0) scharge,
nvl(t.charge,0) bcharge,
nvl(s.cost,0) cost,
t.trate tetrate,
s.trate otrate,
nvl(s.orcdrs,0) ocdrs,
nvl(t.tecdrs,0) tcdrs from providers p,
-- Subconsulta T
(select c.pid,
count(*) col,
ceil(sum(elapsedtim)/60) dur,
ceil(sum(billdurbytype(elapsedtim,tbtype))/60) bdur,
sum(bcharge) charge,SUM(DECODE(p.elapsedtim,0,0,p.brate)) trate ,
SUM(DECODE(p.elapsedtim,0,0,1)) tecdrs
from proxycdr p, providers c
where p.cdate > to_date('010606', 'DDMMYY') and
p.cdate < to_date('300606', 'DDMMYY')+1 and
p.pidt=c.pid and
((to_char(p.prefix) like '%'))
group by c.pid ) t ,
-- Subconsulta S
(select c.pid,
count(*) col,
ceil(sum(elapsedtim)/60) dur,
ceil(sum(billdurbytype(elapsedtim,obtype))/60) bdur,
sum(scharge) charge, sum(bcharge) cost,
SUM(DECODE(p.elapsedtim,0,0,p.brate)) trate ,
SUM(DECODE(p.elapsedtim,0,0,1)) orcdrs
from proxycdr p, providers c
where p.cdate > to_date('010606', 'DDMMYY') and
p.cdate < to_date('300606', 'DDMMYY')+1 and
p.pid=c.pid and
((to_char(p.prefix) like '%'))
group by c.pid ) s
where p.pid=T.pid(+) and p.pid=s.pid(+) order by p.name

Como veran es anidada (tiene 2 subconsultas) y lo que devuelve es una tabla con un resumen del trafico de los proveedores, con totalizacion de cantidad de llamadas, precio, costo, tanto de los que llamas como aquellos a traves de los cuales se realizan llamadas...
Recuerden que anda con un rango de fechas corto... El que esta arriba (del 01/06 al 30/06 ya da error, tienen que ser como mucho veintipico dias)

Desde ya muchas gracias

mas info:

los campos bcharge y scharge tienen el cargo (precio) de las llamadas entrantes y salientes...
billdurbtype es una funcion almacenada en la base
y si, me reconoce todas las funciones porque a veces anda...
es mas, si la misma consulta la ejecuto desde el sql navigator (que es para el oracle algo asi como el sql query del sql server) en el servidor donde esta la base de datos, anda perfectamente...
y como dije, desde la pagina tambien anda, pero con rangos de fechas cortos..

segui haciendo pruebas, y esto es a veces... en algunos minimos casos, pude hacerla andar desde la pagina, simplemente intentantado enesimas veces...
tambien parecio mejorar (no se si mejoro) "dando vuelta" las cosas en to_date, ahora con MMDDYY, tal vez asi trabaja menos,p orque el server esta en ingles...

y no, no la hice yo... es de un sistema obsoleto que estoy recuperando...
tal vez lo mejor sea volver a empezar... pero esta bastante bien esto, asi que me gustaria aprovecharlo

para mi tiene que ver con algo del estilo time out...
aunque seguramente la forma en que esta hecha la consulta no sea la optima...

nuevamente gracias por la prontitud de las respuestas

espero ansioso otro comentario

luego:

Bueno... como dije probe con eso de crear la tabla temporal...

Desde la pagina asp hago:

Conn.Execute("insert into TEMPORAL" & SQLstring )

Donde Conn es una conexion ADO, TEMPORAL es la tabla temporal en la que quiero guardar los datos y SQLString es la cadena que tiene la consulta tan nombrada...

Esto me devuelve el string del insert que, si lo ejecuto desde el server, me pone los registros en esa tabla (con lo que solucionaria el problema)... Pero desde la pagina no se por que no me los pone... Tarda un rato, como que esta haciendo algo, y no me da ningun error... Pero no me inserta los registros...
Como la base es Oracle y se que necesita (necesita?) un commit, le pongo despues Conn.Execute("commit") y obtengo los mismos resultados.... No tengo registros...

El problema parece haberse convertido en otro...
Pero sigue siendo un problema....
Auqnue distinto... ytal vez surgan nuevas ideas....

Nuevamente GRACIAS!!!

Tras nuevas pruebas, con esto de la tabla temporal, si... puedo hacer inserts... con rangos de fechas chicos...
Estamos en la misma... Si el rango de fechas es grande no hace el insert (como pasaba con el select)...

Estuve tocando los timeouts (les recuerdo), tanto los del internet information server, como los propios de oracle (parametro sqlnet.expire_timeout del archivo sqlnet.ora, el cual anule y aumente) y hasta en la pagina misma... Sin ningun resultado...
Por lo que entiendo, cuando desde la pagina mando el insert al oracle, se las tiene q arreglar el oracle, y no depende de asp, ni de la maquina cliente... Entonces, si anda desde el server, porque no anda si lo mando desde la pagina... Por eso pienso que algo tiene q ver la pagina.. Me dijeron que tal vez sea la conexion, que tengo que actualizar la libreria ADO, etc...
Pero todavia no me convence... Tengo que hacerlo de nuevo?