Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Consultas extremadamente lentas en Delphi y rapidicimas en PL/SQL(ORACLE) (https://www.clubdelphi.com/foros/showthread.php?t=74623)

pnsd_89 29-06-2011 18:13:40

Consultas extremadamente lentas en Delphi y rapidicimas en PL/SQL(ORACLE)
 
Buenos dias amigos. Tengo un problemon y queria consultartes, para ver si alguna vez haz tenido un incombeniente similar o si tendrian alguna solucion... El tema es que uso Delphi 6 con Oracle 10g y cada tanto se van actualizando los parches del Oracle.. Y mi problema es que cuando hago un select directo desde el PL/SQL la velocidad de respuesta es rapidicima(de 5 a 10 seg).. encambio cuando lo hago desde el delphi llega a tardar como un minuto y medio a dos minutos.. cosa que en
se que desde el Delphi la respuesta es mas lenta.. pero no es tan significativa como en este caso..
desde ya muchisimas gracias...
Atte y Aguardando sus respuesta.
Pablo 1989:)

pnsd_89 29-06-2011 18:17:32

PD: Las interfaces funcionaban normalmente hasta hace unos cuantos dias.. y las consultas utilizan todos los indices de la tabla.. (no tienen muchos indices y no es mucho los recursos que consume de la BD) HELLLLPPPPPPPP :eek:!!!!!

Casimiro Notevi 29-06-2011 18:21:28

Hola, no nos has dado ninguna información para poder ayudarte :confused:

Además que no se entiende lo que has dicho, delphi no es un sistema de bases de datos, ¿cómo lo comparas con oracle?.
Otro punto es: "la velocidad de respuesta es rapidicima(de 5 a 10 seg)".
¿Rapidísimo 10 segundos?, mis clientes me matarían si las consultas tardaran tanto tiempo :confused:


Por favor, explica clara y detalladamente todo para que podamos ayudarte.

duilioisola 29-06-2011 18:52:46

Como Casimiro, opino que no nos has dado casi nada de información.
- Trabajas con Delphi 6.
- Base de datos es Oracle10g

Algunas de las cosas que deberías facilitarle a quien desees que te ayude:
- El SQL que utilizas para generar la consulta.
- Componente Delphi con el que te comunicas con la base de datos
- Parte del código Delphi. La parta en que generas la consulta y la ejecutas.
- Qué haces con esos datos (reporte impreso, grid, operaciones para generar un resultado, etc.)
- Estructura de las tablas

duilioisola 29-06-2011 18:54:51

Y a pesar de que no nos has dado información, voy a hacer una SUPOSICIÓN:

Puede ser que 5 a 10 segundos sea lo que tarde en llegar el primer registro y luego 1 o 2 minutos el último.

Esto puedes probarlo haciendo la consulta PL/SQL y luego ir al último registro y ver cuanto tarda.

Al González 29-06-2011 18:58:34

Cita:

Empezado por Casimiro Notevi (Mensaje 405139)
mis clientes me matarían si las consultas tardaran tanto tiempo :confused:

Casi, ya no trabajes para esa gente. :D

Pablo, tienes que explicar qué componentes, controladores, etc. usas para la conexión y las consultas. Además de poner un ejemplo de la sentencia SQL que se demora y dar más detalles de las tablas involucradas y cuántos registros devuelve aproximadamente esa consulta.

Saludos escandalosos.

Al González.

Casimiro Notevi 29-06-2011 20:25:37

Cita:

Empezado por Al González (Mensaje 405146)
Casi, ya no trabajes para esa gente. :D
Saludos escandalosos.
Al González.

je, je... bueno, habría que saber qué sentencia es, no es lo mismo diez segundos para sacar un informe de ventas, gastos y beneficios acumulados por cliente, artículo y día de la semana durante todo un año, que 10 segundos cada artículo de una venta en un tpv :)

pnsd_89 29-06-2011 21:55:33

Señores... tienen razon disculpen.. y pueden notar en la forma de escribir(aparte de no saber..) estoy desesperado...
Bueno este es el tema es que no puedo dar muchos datos por que sino en la empresa me cuajan...
Pero bueno hare lo posible para detallar al maximo mi problema...

Bueno Utilizo los componentes DBExpress.. Query + DSP+ CDS+DS

Tengo una tabla donde entran como minimo 10 transacciones por segundo...

Las ventanas que estoy usando hacen consultas a esta tabla por lo que tarda 5 a 10 segundos desde el pl/sql.. Y antes que comiencen los problemas, estas ventanas de 10 segundos que tardaban en el pl/sql, solo tardaba 15 a los mas desde la ventana con los DBExpress... pero ahora la diferencia es demaciado notoria, tanto que parece exajerada.. :confused:

Pruebo desde el pl/sql y me fijo si tienen algun full acces pero nada raro.. utiliza todos los indices no hay nada malo!! con el mismo select que extraigo de mi TQuery... es eso lo que no entiendo...

Lo peor de todo es que hace tiempo que estas ventanas no se tocan ya que nunca causaron problemas y funcinaban eficientemente...

ahora otracosa me conecto al Oracle mediante el TCRSQLConnection.. El cual usa como driver el Oracle Direct (Core Lab).

He provado eliminar y vuelto a crear todos mis DBExpress para provar si alguno se corrompio, pero pero lo mismo:(

Ahora los parches del Oracle los acaban de actualizar... alguna vez a alguien le ocurrio algo similar a esto?

Desde ya muchisimas gracias enserio... y gracias a ustedes hoy puedo utilizar Delphi.. son lo mas :) Larga vida al Club Delphi !!

Neftali [Germán.Estévez] 30-06-2011 12:24:54

Tal y como te he comentado por otros cauces, creo que el problema es debido a que no estás haciendo lo mismo en ambos casos. No estás trayendo el mismo número de registros.

Me da la impresión (y me ha parecido leer que usas ClientDataset -cosa que lo reafirmaría-) de que con delphi estás trayendo TODOS los registros de la consulta, cosa que no se hace cuando la ejecutas desde el cliente de Oracle.

Has una prueba; Te puedo decir cómo hacerla con ADO, porque no se si los componentes que utilizas poseen la propiedad de cambiar el tipo de cursor.

Si la tienen prueba con los que usas, sino prueba con ADO y sabrás si ese es el problema:

(1) Coloca un formulario y un ADOQuery.
(2) Rellena la SQL y creo la cponexión con Oracle.
(3) Abre la consulta a ver qué tarda.
(4) Haz lo mismo cambiando los valores del cursor para Cliente y Server y a ver si se nota diferencia.



Un saludo.

pnsd_89 30-06-2011 15:19:39

Muchisimas gracias por sus respuestas!!!

He visto en los componentes DBLexpress y por lo que pude ver no tienen estas propiedades... voy a ver si hay algo similar que pueda hacer.. o algo asi.. pero los componentes creo que ya no los puedo cambiar ya que implicaria una reingenieria del sistema...

MUCHISIMAS GRACIAS POR SUS RESPUESTAS ENSERIO!!

si tienen alguna otra idea seria de gran ayuda saberla...





a mal tiempo buena cara

pcicom 30-06-2011 16:30:43

Si tu sistema solo se ejecuta en tu RED LOCAL... creo que no tiene sentido el que actualices tu ORACLE por los parches...

Normalmente puede que estos parches afecten la eficiencia de tu actual version, y mas considerando que entonces tambien posiblemente requerias la actualizacion de tu componente de acceso a la BD... segun lo critico de los cambios en la BD (ORACLE)..

En lo particular de mi caso NO ACTUALIZO mis BD sin antes hacer un TEST de EFICIENCIA en otro equipo, ya que comunmente he notado que a veces suceden detalles que implican cambios adicionales y otros sucesos como los que mencionas lentitud...

Una vez consultados los detalles de como solucionar esto realizo lo necesario para migrar a la nueva version actualizacion de la nueva version de mi BD..


SALUDOS..

Al González 30-06-2011 17:54:40

Cita:

Empezado por Neftali (Mensaje 405184)
Te puedo decir cómo hacerla con ADO, porque no se si los componentes que utilizas poseen la propiedad de cambiar el tipo de cursor.

Cita:

Empezado por pnsd_89 (Mensaje 405191)
[...] por lo que pude ver no tienen estas propiedades... voy a ver si hay algo similar que pueda hacer [...]

Hace años que no uso ADO porque no me agrada que el manejo de base de datos dependa tanto de las DLLs de Windows y sus actualizaciones. Alguna vez utilicé las propiedades CursorType y CursorLocation, aunque ahora mismo no recuerdo con qué propósito. :)

En caso de que continúes con DBX + TClientDataSet, puedes usar la propiedad PacketRecords que, cuando es mayor a 0, sirve para indicar la cantidad de registros que debe traerse de un golpe. Así, la apertura del conjunto de datos puede ocurrir de forma inmediata, y, conforme navegues en él, se traerá "paquetes" adicionales de la misma cantidad de registros.

Cabe mencionar que esto lo uso poco, ya que en la mayoría de los casos realizo consultas de no más de unas decenas de registros, y cuando necesito traer miles es por algún proceso que amerita la amable espera por parte del usuario.

Un abrazo en abonos.

Al González. :)

pnsd_89 30-06-2011 18:10:34

Cita:

Empezado por pcicom (Mensaje 405193)
Si tu sistema solo se ejecuta en tu RED LOCAL... creo que no tiene sentido el que actualices tu ORACLE por los parches...

Gracias pcicom.. pero es mas que necesario que esta BD se actualice ya que no solo funciona con la red local ya que tiene varios sistemas trabajando sobre el...

Cita:

Empezado por Al González (Mensaje 405196)
Hace años que no uso ADO porque no me agrada que el manejo de base de datos dependa tanto de las DLLs de Windows y sus actualizaciones. Alguna vez utilicé las propiedades CursorType y CursorLocation, aunque ahora mismo no recuerdo con qué propósito. :)

En caso de que continúes con DBX + TClientDataSet, puedes usar la propiedad PacketRecords que, cuando es mayor a 0, sirve para indicar la cantidad de registros que debe traerse de un golpe. Así, la apertura del conjunto de datos puede ocurrir de forma inmediata, y, conforme navegues en él, se traerá "paquetes" adicionales de la misma cantidad de registros.

Cabe mencionar que esto lo uso poco, ya que en la mayoría de los casos realizo consultas de no más de unas decenas de registros, y cuando necesito traer miles es por algún proceso que amerita la amable espera por parte del usuario.

Un abrazo en abonos.

Al González. :)


SOS LO MAS AL González!! gracias voy a probar luego de hacer una super bkp del programita.. segun los usuarios xS

Neftali [Germán.Estévez] 01-07-2011 09:55:07

Cita:

Empezado por Al González (Mensaje 405196)
En caso de que continúes con DBX + TClientDataSet, puedes usar la propiedad PacketRecords que, cuando es mayor a 0, sirve para indicar la cantidad de registros que debe traerse de un golpe. Así, la apertura del conjunto de datos puede ocurrir de forma inmediata, y, conforme navegues en él, se traerá "paquetes" adicionales de la misma cantidad de registros.

Pues básicamente eso es lo que hace el tipo de cursor ServerType.
En el caso de ADO tiene un número predeterminado (250/500); Que ahora no recuerdo si se puede cambiar utilizando las ExtendedProperties.

Básicamente el tiempo que tardas, es el que tarda la consulta, ya que luego los registros se traen de forma prograsiva a medida que se van necesitando. El el caso de no estar así, ejecutas la consulta y luego traes TODOS los registros (que creo que es lo que te debe estar pasando a tí), por eso te tarda tanto. En realidad la consulta te debe tardar poco, es probable que todo el tiempo lo consumas al traerlos.


La franja horaria es GMT +2. Ahora son las 19:57:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi