SQL:中断查询

SQL:中断查询,sql,mysql,kill,interrupt,mysqladmin,Sql,Mysql,Kill,Interrupt,Mysqladmin,我曾经在一个使用专有非SQL数据库的项目中工作过,在这个项目中,查询可能会被中断,在代码库中,有相当多的地方使用了这种功能性,并且非常有意义(例如,停止一个被用户取消的长时间运行的查询,或者当最近的查询发生并使以前的查询过时时,等等),我意识到我以前从未真正看到过这种“中断的查询”,并认为它可以成为一个很好的问题(有几个问题,但都与同一件事有关): SQL查询可以被中断吗 这是SQL标准的一部分吗 如果它不是SQL标准的一部分,那么哪些SQL DB允许中断查询(最受欢迎的示例) 中断一个DB查

我曾经在一个使用专有非SQL数据库的项目中工作过,在这个项目中,查询可能会被中断,在代码库中,有相当多的地方使用了这种功能性,并且非常有意义(例如,停止一个被用户取消的长时间运行的查询,或者当最近的查询发生并使以前的查询过时时,等等),我意识到我以前从未真正看到过这种“中断的查询”,并认为它可以成为一个很好的问题(有几个问题,但都与同一件事有关):

  • SQL查询可以被中断吗

  • 这是SQL标准的一部分吗

  • 如果它不是SQL标准的一部分,那么哪些SQL DB允许中断查询(最受欢迎的示例)

  • 中断一个DB查询(SQL或非SQL)是常见的吗?你知道你不再关心结果了吗?(在我编写的代码库中,它确实有助于减轻服务器的负载)

Imho“interrupted”应替换为“killed”或“terminated”。中断的概念可能会令人困惑,因为人们可能会认为它会允许稍后恢复查询

SQL标准没有提供中断或终止正在运行的查询的方法,但我知道的每个DBMS都会执行KILL命令或类似命令。例如,在MySQL中,用户可以使用SHOW[FULL]PROCESSLIST查看所有正在运行的查询(及其状态、查询ID等)。具有KILL权限的用户可以终止查询


大多数死机发生的原因是一个查询有运行时间过长的风险或正在阻止其他查询,例如表缺少索引或磁盘已满。当您不关心结果(例如用户取消了站点导航)时,通常Web服务器本身会中止该过程,从而导致查询本身(无需手动或程序员交互)

我使用过的所有RDBMS访问层都提供了一种取消方法,用于异步取消正在运行的查询。请查看文档中所使用的任何数据访问技术堆栈。.NET/ADO/JDBC提供一种“取消”方法。ODBC-SQLCancel。 显然,底层RDBMS供应商的数据访问驱动程序也必须实现该方法

就取消的有效性而言,我倾向于批评任何经常使用它的计划。在我看来,更好的协调和/或设计将有助于缓解非行政需要

这主要取决于RDBMS的内部结构、事务的性质和隔离方案取消一个正在运行的查询可能会涉及到一个潜在的昂贵的回滚操作。在最坏的情况下,一个查询运行一个小时直到取消点可能需要另外一个小时才能回滚