Jump to content


Photo

Como detener una consulta en proceso


  • Please log in to reply
11 replies to this topic

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 31 January 2010 - 08:29 PM

Hola a todos

Quiero saber si hay alguna forma de abortar una consulta sql  en proceso y que esta tardando demasiado.

Uso Zeos y Firebird 2.1 

gracias de antemano
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 31 January 2010 - 08:54 PM

mmm...la mejor forma de realizar eso es programando  por medio de hilos usando las API CreateProcess, TerminateProcess y ResumeThread, es lo que se me ocurre en este momento.

Saludos.
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 31 January 2010 - 08:56 PM

Algo más completo.

Saludos.
  • 0

#4 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 31 January 2010 - 09:14 PM

gracias enecumene dejame revisar como hacer funcionar esto en mi programa y cualquier cosa informare el avance.

pensaba que habria algun evento en el query que me permitiera detener la consulta o algo asi.


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 31 January 2010 - 09:17 PM

gracias enecumene dejame revisar como hacer funcionar esto en mi programa y cualquier cosa informare el avance.

pensaba que habria algun evento en el query que me permitiera detener la consulta o algo asi.


Pues por el momento desconozco otra opción para lo que necesitas. :(
  • 0

#6 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1484 posts
  • LocationMallorca

Posted 01 February 2010 - 01:55 AM

En Firebird 2.1, puedes cancelar una sentencia en ejecución, eliminándola de la tabla de monitor de actividad MON$STATEMENTS.

Cancel executing query

Information about executing queries is available from the table MON$STATEMENTS. If you want cancel any query you must delete record from the MON$STATEMENTS, for example:

delete from mon$statements where mon$sql_text = :sql_text

Sometimes query text doesn’t available, however you can detect required query by alternate parameters like MON$STATE (query activity [1 - active, 0 - idle]) or MON$TIMESTAMP (query start time).


NOTA: No lo he probado nunca, ya que aún utilizo FB 2.0

Saludos.
  • 0

#7 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 01 February 2010 - 06:27 AM

Gracias marc, voy a investigar mas sobre esto y a probar.

  • 0

#8 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 01 February 2010 - 08:33 PM

Pues Marc no se donde ubicar el codigo que me has pasado. He tratado de ponerlo en un boton y en un timer pero no me ha funcionado. Lo he puesto como una consulta sql con text y no he logrado nada.

Me podrias dar una idea mas detallada de como usar estas tablas de monitoreo de firebird 2.1
Se que has dicho que no las has utilizado, pero con tu experiencia, me gustaria oir una sugerencia de como utilizarlas.

Todo esto no es excluyente de los demas miembros del foro, sus ideas son bienvenidas. Solo le explico en principio a Marc, porque el fue quien me dio esa idea.

talvez al final tenga que usar la idea de enecumene sobre los hilos  y  talvez unirla a la idea de marc.



  • 0

#9 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 01 February 2010 - 09:49 PM

Saludos.

luk2009, las aplicaciones de por si es un hilo "permanente" hasta que la misma finaliza.

Por ende, cuando realizas cualquier proceso y toma tiempo la aplicación tiende a colgarse o a tardar en responder; te exhorto a que hagas uso de lo mencionado por Enecumene más ligado a lo mencionado por Marc.

Así que al momento de lanzar tu consulta creas un hilo y tu aplicación podrá responder a otro proceso simultaneo, aquí es donde entra la explicación de Marc, pones un botón con la sentencia de cancelar la consulta.

Has este ejercicio y nos cuenta.
  • 0

#10 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1484 posts
  • LocationMallorca

Posted 02 February 2010 - 03:59 AM

Com bien dice Rolphy, tu problema es que por defecto tu aplicación no responde hasta que no termine la consulta que está ejecutando. Ya que el thread principal de la aplicación está ocupado en la consulta.

Esto se puede solucionar ejecutando las consultas en threads separados, como te han comentado, o bastante más sencillo (aunque no tan cómodo para el usuario) : poniendo el monitoreo y cancelación de consultas en una segunda aplicación independiente.

Como es una aplicación independiente no tendrás el problema de que esté bloqueada hasta que finalice la ejecución de la consulta problemática.

Yo lo que haría es que esa aplicación mostrase las consultas que tiene el usuario en activo (mediante un select sobre MON$STATEMENTS), y desde ahí permitiese borrar un registro para cancelar la consulta.

Saludos.
  • 0

#11 tacubo

tacubo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 130 posts

Posted 02 February 2010 - 09:17 AM

hola luk mira a mi parecer en primera yo no se hacer consultas de delphi aun pero estoy en proceso lo que a mi parecer yo te recomendaria pues es que primero hagas tu consulta por fuera es decir en sql o cualquier motor que uses primero checa si es desde ahi donde esta tardando la consulta o la hace pesada a mi parecer puede ser por las siguientes razones: si tu estas haciendo una relacion en la que primero buscas de varias tablas es decir como por ejemplo de 5 tablas y digamos que cada una tiene 100 registros si tu empiezas hacer los where por cada una recuerda que aunque hayas puesto una condicion tiene que buscar en cada tabla y seria consultar 400 o 500 veces para que vea cuales son las coincidencias ademas de que tambien debes de ver si estas tienen indices luego las consultas tardan demasiado porque cuando haces tu where a lo mejor un campo no esta relacionado con el otro por el indice eso tambien es importante porque as de cuenta que es como un libro cuando tu buscas algo es por el indice se hace mas facil pero si no estan relacionados estos tambien es como buscar palabras al azar bueno es un comentario un poco afuera de lo de delphi pero que a mi consideracion deberias de tomar en cuenta
  • 0

#12 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 02 February 2010 - 09:46 AM

Gracias Tacubo por tu respuesta. Mi problema no es que la consulta se haga lenta, esa parte funciona bien haciendo muchas de las cosas que indicas. Inclusive tomando en cuenta algo que Marc me dijo sobre hacer dons indices uno asc y otro desc, con lo cual las consultas vuelan. El problema es que como busco por rango de fechas en una base de datos de un millon de registros, si quiero detener la consulta en algun momento no puedo. Las soluciones que me han dado Marc y Enecumene son perfectas. Solo debo comenzar a trabajar con los hilos y resolver.


  • 0




IP.Board spam blocked by CleanTalk.