【问题标题】:How to stop a running query?如何停止正在运行的查询?
【发布时间】:2017-10-12 02:18:48
【问题描述】:

我使用 RODBC 向 SQL-Server 发送查询。有时它们运行时间太长,所以我需要取消它们。

单击 RStudio 中的红色“停止”按钮会产生以下错误消息:

R 没有响应您中断处理的请求以便停止 您可能需要完全终止 R 的当前操作。

终止 R 将导致您的 R 会话立即中止。积极的 计算将被中断和未保存的源文件更改和 工作区对象将被丢弃。

你想现在终止 R 吗?

如果我单击“是”,我的会话确实会终止。 (注意:使用 Rgui 代替 RStudio 并不能让事情变得更好)

但是:

  • 当我使用另一个软件(名为“Query ExPlus”)连接到同一个 SQL-Server 时,我有一个类似的停止按钮,单击它会立即中断查询,而不会发生任何崩溃。

  • 当我使用 RPostgres 包连接到 PostgreSQL 数据库时,我还可以随时中断查询。

这两点让我觉得应该有办法解决我的问题。我能做什么?

到目前为止,我的解决方法是:

library(RODBC)
library(R.utils)

withTimeout(mydf <- sqlQuery(myconnection, myquery), timeout=120)

注意:我无权从数据库端终止查询。

【问题讨论】:

  • R在等待SQL查询的结果,基本只能在两行代码之间停止R。即使是用 C 语言编写的 R 函数也不能以这种方式被杀死。您可以选择将 SQL 调用包装在 R 脚本中,您将在主脚本的 shell 中运行,将选项设置为在不等待输出的情况下执行。然后在您的主脚本中,您每 10 秒左右发送一个新查询,该查询将检查主查询是否结束,例如通过检查行数或表是否存在。在此代码上,停止按钮将起作用。然后从 R 中运行另一个 CMD 行来终止 SQL 查询。
  • 好像你没有最后一步的权限。然后给你的管理员发邮件说你又搞砸了:)。如果您可以将查询分成几个部分,然后在 R 中通过循环运行它们,那么您可以监控您的进度并在任何步骤完全终止该过程。
  • 谢谢,这确实是一种可能的方法。我尝试过的类似方法是在 ODBC 连接中使用参数 rows_at_time=1(对于 here Hadley 说,您可以随时停止 RPostgres,因为它一次获取一行)。但这并没有改变任何东西。

标签: sql-server r rodbc


【解决方案1】:

我刚刚偶然发现了odbc 包。它允许随时中断查询。

基本用法如下:

library(DBI)

myconnection <- dbConnect(odbc::odbc(),
                          driver = "SQL Server",
                          server = "my_server_IP_address",
                          database = "my_DB_name",
                          uid = "my_user_id",
                          pwd = "my_password")

dbGetQuery(myconnection, myquery)

我对幕后发生的事情没有深入的了解,但就我个人使用到目前为止所看到的而言,这个包比RODBC 有其他优势:

  • 真的更快
  • 从数据库中获取列类型而不是猜测它们(参见here
  • 不需要stringsAsFactorsas.is 参数

【讨论】:

  • 我也使用odcb。该命令可以停止,但查询显然仍在服务器上运行。如果我尝试另一个查询,我会收到以下错误:nanodbc/nanodbc.cpp:1587: HY000: [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt
【解决方案2】:

尝试在查询之前设置您的连接:

sql = odbcConnect('Database name')

然后使用同一行来运行您的查询:

mydf &lt;- sqlQuery(sql, " myquery ")

注意:运行时间取决于数据库和 R 服务器,但以这种方式设置连接应该可以解决终止问题。

【讨论】:

  • 谢谢,但我显然在发送查询之前设置了连接。
【解决方案3】:

尝试关闭 SQL Server Management Studio 上的“选项卡查询” 然后会出现弹窗,

此查询当前正在执行。要取消此查询吗?

无论如何都要取消,选择“是”。

【讨论】:

  • 我的查询是从 RStudio 发送的,而不是从 SSMS 发送的。
【解决方案4】:

大多数 SQL Server 用户使用 SQL Server Management Studio(免费,可从 Microsoft 下载)连接到 SQL Server 或通过名为 SQLCMD 的工具从命令行执行命令。

如果您可以确定正在运行 SQL 命令的会话 ID,则可以终止会话,这将停止任何正在执行的命令。 SQL Server 仍需要时间(可能是“很长”时间)来回滚在命令执行期间所做的任何更改。

终止会话(取决于软件)可能需要一段时间才能与 SQL Server 沟通会话已终止。当我使用链接服务器从 SQL Server 连接到 DB2 时,DB2 将缓冲终止命令,并且 DB2 经常需要长达一个小时才能意识到会话已终止。

要确定您正在运行的会话,您可以尝试:

select @@spid;

一旦你有了 spid(比如说 86) 然后您可以发出(取决于您是否有权这样做)

kill 86;

但正如微软所说: 终止基于会话 ID 或工作单元 (UOW) 的用户进程。如果指定的会话 ID 或 UOW 有很多工作要撤消,则 KILL 语句可能需要一些时间才能完成,尤其是在涉及回滚长事务时。

【讨论】:

  • 感谢本杰明,但正如我的问题中所述,我无权使用 kill
  • 那么除了停止会话之外,您无能为力。
  • 好的...但是你如何解释Query ExPlus可以做到呢?
  • 它可能是更好的产品,但会以某种方式终止事务和/或会话。我根本不了解这些产品,绝大多数 SQL Server 开发人员使用 SQL Server Management Studio 和/或 Visual Studio 与 SQL Server 交互,因此对其他产品的支持量将相当微薄......跨度>
猜你喜欢
  • 2011-04-16
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
相关资源
最近更新 更多