7

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

  • SQL查询可以中断吗?

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

  • 如果它不是 SQL 标准的一部分,哪些 SQL DB 允许中断查询(任何示例都非常受欢迎)?

  • 中断数据库查询(SQL 与否)是否常见,您会知道您将不再关心结果?(在我工作的代码库中,它确实有助于减轻服务器的负载)

4

2 回答 2

6

恕我直言,“中断”应替换为“杀死”或“终止”。中断的概念可能会令人困惑,因为人们可能会认为它会允许稍后恢复查询。

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

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

于 2010-05-02T21:34:15.143 回答
5

我曾经使用过的所有 RDBMS 访问层都提供了一种取消方法来异步取消正在运行的查询。检查文档以了解您正在使用的任何数据访问技术堆栈。.NET/ADO/JDBC 提供“取消”方法。ODBC - SQLCancel。显然底层RDBMS厂商的数据访问驱动也必须实现该方法。

In terms of usefullness of cancellation I would tend to be critical of any scheme that made regular use of it. In my opinion better coordination and or design would tend to mitigate non-administrative need.

There is significant dependance on the internals of the RDBMS, nature of the transaction and isolation scheme. If the RDBMS uses an optimistic concurrency model (ie commit is essentially free) canceling a running query can involve a potentially expensive rollback operation. In a worst case a query running for an hour up to the point of cancellation may very well take another hour to rollback.

于 2010-05-02T22:12:09.363 回答