如何停止 运行 查询?

How to stop a running query?

我使用 RODBC 将查询发送到 SQL-服务器。有时它们会花费太多时间运行,所以我需要取消它们。

单击 RStudio 中的红色 "stop" 按钮会产生此错误消息:

R is not responding to your request to interrupt processing so to stop the current operation you may need to terminate R entirely.

Terminating R will cause your R session to immediately abort. Active computations will be interrupted and unsaved source file changes and workspace objects will be discarded.

Do you want to terminate R now?

如果我点击是,我的会话确实终止了。 (注意:使用 Rgui 而不是 RStudio 并不能使事情变得更好)

但是:

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

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

library(RODBC)
library(R.utils)

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

注意:我没有从数据库端终止查询的权限。

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

如果您可以确定 SQL 命令正在 运行 中的会话 ID,您可以终止会话,这将停止任何正在执行的命令。 SQL 服务器仍需要时间(可能是 'long' 时间)来回滚在命令执行期间所做的任何更改。

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

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

select @@spid;

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

kill 86;

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

尝试在 SQL Server Management Studio 上关闭您的 "tab query" 然后会弹出,

This Query is currently executing. Do you want to cancel this query ?

仍然取消,选择"yes"。

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

sql = odbcConnect('Database name')

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

mydf <- sqlQuery(sql, " myquery ")

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

我刚刚偶然发现了 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 有其他优势:

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