Foros del Web » Programando para Internet » ASP Clásico »

Problema con consulta en Oracle desde ASP

Estas en el tema de Problema con consulta en Oracle desde ASP en el foro de ASP Clásico en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 06/07/2006, 08:25
 
Fecha de Ingreso: julio-2006
Mensajes: 2
Antigüedad: 17 años, 11 meses
Puntos: 0
Exclamación Problema con consulta en Oracle desde ASP

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?
  #2 (permalink)  
Antiguo 06/07/2006, 09:05
 
Fecha de Ingreso: enero-2006
Mensajes: 72
Antigüedad: 18 años, 4 meses
Puntos: 0
Que tal MarMed...Bienvenido al foro:

Sinceramente no se como lograste formular este post, lo digo por el orden en que expones las ideas, lo cierto del caso es que cuando se trabaja con codigo que ya esta hecho y usualmente (como suele pasar) a veces las cosas no funcionan como uno espera...lo mejor es reformular...esto por supuesto si consideras que ya has intentado todo y no has conseguido lo que esperabas, para ser mas claro...lo mejor en este caso seria plantear una nueva consulta...considerando lo que puedas aprovechar de la actual y que al mismo tiempo cumpla con el objetivo...pues por que si ya has intentado modificar el TIME OUT en la hoja ASP, a nivel del IIS y desde el propio RBDMS....no creo que haya otra cosa que se pueda hacer. Mas bien me inclinaria (tal cual lo expones tu)...a revisar un poco la logica del QUERY. El query habia sido implementado en una aplicación anterior? Como era el rendimiento desde esa aplicación? (Si es afirmativa) ---> Que tipo de conexión se usaba? Seria conveniente que comentaras esos datos, si te es posible postea la forma en que estas haciendo la conexión. Saludos
__________________
"Detrás de toda adversidad, hay una bendición escondida."


Aldous Huxley. :arriba:
  #3 (permalink)  
Antiguo 06/07/2006, 09:11
 
Fecha de Ingreso: julio-2006
Mensajes: 2
Antigüedad: 17 años, 11 meses
Puntos: 0
Sonrisa

Si Xcorpio... El orden es un tanto extraño e "inestable" porque este post lo vengo arrastrando de varios foros... Voy llevando mi duda a distintos lados...
Gracias por el consejo... y es lo que supuse...
Pero tengo fe en que alguna solucion habra...

Eso espero...

Igual, ya voy a empezar a pensar en como ir haciendolo...

Con respecto a la conexion, la hago con la libreria ADO, mediante un DNS

Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:45.