2010-05-02 192 views
7

我在使用专有的非SQL数据库的项目上工作过,其中查询可能被中断,并且在代码库中有相当多的地方使用了该功能,并且非常合理(例如停止一个长时间运行的查询被用户取消,或者当一个更近的查询发生并且呈现先前的查询时,等等),并且我意识到我以前从未真正地看到过那种“中断查询”,并认为它可以使好SO问题(几个问题,但他们都完全相同的东西):SQL:中断查询

  • SQL查询可以中断?

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

  • 如果它不是SQL标准的一部分,哪个SQL DB允许查询被中断(最欢迎任何示例)?

  • 中断一个数据库查询(SQL与否)是很常见的,你会知道你不会在乎结果吗? (在我工作的代码库,它肯定有助于减轻服务器的负载)

回答

6

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

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

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

4

所有RDBMS访问层I'我曾与提供取消方法异步取消正在运行的查询。查看文档,了解您正在使用的任何数据访问技术堆栈。 .NET/ADO/JDBC提供了一个'取消'方法。 ODBC - SQLCancel。 很明显,RDBMS厂商的数据访问驱动程序必须实现该方法。

就取消的有用性而言,我倾向于对任何定期使用它的方案提出批评。在我看来,更好的协调和设计会减轻非管理需求。

RDBMS的内部,交易的性质和隔离方案有很大的依赖性。如果RDBMS使用乐观并发模型(即,提交本质上是免费的),取消正在运行的查询可能涉及潜在的昂贵的回滚操作。在最坏的情况下,运行一个小时直到取消点的查询可能需要一个小时才能回滚。