代码之家  ›  专栏  ›  技术社区  ›  NoozNooz42

SQL:中断查询

  •  7
  • NoozNooz42  · 技术社区  · 16 年前

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

    • SQL查询是否可以中断?

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

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

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

    2 回复  |  直到 16 年前
        1
  •  6
  •   Konerak    16 年前

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

    SQL标准不提供中断或终止正在运行的查询的方法,但我认识的每个DBMS都会实现kill命令或类似命令。例如,在mysql中,用户可以使用show[full]processlist查看所有正在运行的查询(以及它们的状态、查询ID等)。具有kill权限的用户可以终止查询。

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

        2
  •  5
  •   Einstein    16 年前

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

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

    这主要取决于RDBMS的内部、事务的性质和隔离方案。如果RDBMS使用乐观并发模型(即commit基本上是免费的),取消正在运行的查询可能会涉及一个潜在的昂贵的回滚操作。在最坏的情况下,运行一个小时直到取消点的查询可能需要一个小时才能回滚。