SQL: 中断查询

7

我曾经参与了一个使用专有非SQL数据库的项目,其中查询可以被中断,在代码库中有很多地方使用了这种功能,并且非常合理(例如停止被用户取消的长时间运行的查询,或者当更近期的查询发生并使先前的查询变得过时等),我意识到我以前从未真正看到过这种“中断查询”的情况,认为这可能是一个好的SO问题(几个问题,但它们都涉及完全相同的事情):

  • SQL查询是否可以被中断?

  • 这是否是SQL标准的一部分?

  • 如果不是SQL标准的一部分,哪些SQL数据库允许中断查询(欢迎任何示例)?

  • 是否常见中断DB查询(无论是SQL还是非SQL),因为你知道自己不再关心结果?(在我工作的代码库中,它确实有助于减轻服务器的负载)

2个回答

6

我认为"interrupted"应该被替换为"被终止"或"被杀死"。因为中断的概念可能会让人产生一个错误的理解,认为查询可以稍后恢复。

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

大多数终止是因为查询风险运行时间过长或阻塞了其他查询,例如:表缺少索引或磁盘已满。当您不关心结果时(例如,用户取消了网站导航),通常Web服务器本身会中止该进程,从而终止查询本身(不需要手动或程序员交互)。


5
我曾经使用过的所有关系型数据库管理系统(RDBMS)访问层都提供了取消正在运行查询的异步取消方法。请查看您正在使用的任何数据访问技术堆栈的文档。.NET/ADO/JDBC提供了“cancel”方法。ODBC - SQLCancel。显然,底层RDBMS供应商的数据访问驱动程序也必须实现该方法。
就取消的有用性而言,我倾向于对任何经常使用它的方案持批评态度。在我看来,更好的协调和/或设计会减轻非管理需求。
这在很大程度上取决于RDBMS的内部情况、事务的性质和隔离方案。如果RDBMS使用乐观并发模型(即提交基本上是免费的),取消正在运行的查询可能涉及潜在昂贵的回滚操作。在最坏的情况下,一个运行了一个小时并到达取消点的查询可能需要另一个小时来回滚。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接