2010-05-02 20 views
7

He trabajado en un proyecto utilizando una base de datos no SQL patentada donde las consultas pueden interrumpirse y en la base de código había bastantes lugares donde esa funcionalidad se usaba y tenía mucho sentido (por ejemplo, detener una consulta de larga ejecución que el usuario cancela, o cuando se realiza una consulta más reciente y deja obsoleta la consulta anterior, etc.) y me di cuenta de que nunca antes había visto ese tipo de "consultas interrumpidas" y pensé que podría hacer una consulta buena pregunta SO (varias preguntas, pero todas están relacionadas exactamente con lo mismo):SQL: Interrupción de una consulta

  • ¿se pueden interrumpir las consultas de SQL?

  • es esta parte del estándar SQL?

  • si no es parte del estándar SQL, que los DB de SQL permiten interrumpir las consultas (¿hay algún ejemplo más bienvenido)?

  • ¿es común interrumpir una consulta DB (SQL o no) que sabrá que ya no le importará el resultado? (En la base de código que he trabajado, seguro que ayuda a aligerar la carga del servidor)

Respuesta

6

En mi humilde opinión "interrumpido" debe sustituirse por 'muerto' o 'terminado'. El concepto de interrupción puede ser confuso ya que se podría suponer que permitiría que la consulta se reanude más tarde.

El estándar SQL no proporciona una forma de interrumpir o terminar una consulta en ejecución, pero cada DBMS que conozco implementa un comando KILL o similar. Por ejemplo, en MySQL, un usuario puede usar SHOW [FULL] PROCESSLIST para ver todas las consultas en ejecución (y sus estados, ID de consulta, etc.). Los usuarios con el privilegio KILL pueden terminar una consulta.

La mayoría de las KILL se producen porque una consulta corre el riesgo de ejecutarse demasiado tiempo o está bloqueando otras consultas, por ej. a la tabla le falta un índice o el disco está lleno. Cuando no le importa el resultado (por ejemplo, el usuario cancela la navegación del sitio), a menudo el servidor web abortará el proceso y por lo tanto la consulta en sí misma (no es necesaria interacción manual o programadora)

4

Todas las capas de acceso RDBMS I ' he trabajado alguna vez con proporcionar un método de cancelación para cancelar asíncronamente las consultas en ejecución. Consulte la documentación de la pila de tecnología de acceso a datos que está utilizando. .NET/ADO/JDBC proporcionan un método 'cancelar'. ODBC - SQLCancel. Obviamente, el controlador de acceso a datos de proveedores de RDBMS subyacente también debe implementar el método.

En términos de utilidad de la cancelación, tendería a criticar cualquier esquema que hiciera un uso regular de la misma. En mi opinión, una mejor coordinación o diseño tenderá a mitigar las necesidades no administrativas.

Existe una dependencia significativa en los aspectos internos del RDBMS, la naturaleza de la transacción y el esquema de aislamiento. Si el RDBMS usa un modelo de concurrencia optimista (es decir, la confirmación es esencialmente gratuita) la cancelación de una consulta en curso puede implicar una operación de retrotracción potencialmente costosa. En el peor de los casos, una consulta que se ejecute durante una hora hasta el punto de cancelación puede tardar una hora más en deshacerse.