web-dev-qa-db-ja.com

実行中のクエリを停止する方法は?

RODBCを使用して、クエリをSQLサーバーに送信します。実行に時間がかかりすぎる場合があるため、キャンセルする必要があります。

RStudioの赤い「停止」ボタンをクリックすると、次のエラーメッセージが表示されます。

Rは処理を中断する要求に応答しないため、現在の操作を停止するには、Rを完全に終了する必要があります。

Rを終了すると、Rセッションが直ちに中止されます。アクティブな計算は中断され、保存されていないソースファイルの変更とワークスペースオブジェクトは破棄されます。

今すぐRを終了しますか?

そして、はいをクリックすると、私のセッションは実際に終了します。 (注:RStudioの代わりにRguiを使用しても、状況は改善されません)

しかしながら:

  • 別のソフトウェア(「Query ExPlus」という名前)を使用してこの同じSQL-Serverに接続すると、同様の停止ボタンがあり、それをクリックすると、クラッシュすることなく即座にクエリが中断されます。

  • rPostgresパッケージを使用してPostgreSQLデータベースに接続すると、いつでもクエリを中断できます。

これらの2つのポイントは、私の問題を解決する方法があるべきだと思うように導きます。私に何ができる?

これまでのところ、私の回避策は次のとおりです。

library(RODBC)
library(R.utils)

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

注:データベース側からのクエリを強制終了する権限がありません。

20
Scarabee

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に対して他の利点があります。

  • 本当に速い
  • 列タイプを推測するのではなく、DBから取得します( here を参照)
  • stringsAsFactorsおよびas.is引数が必要です
7
Scarabee

ほとんどのSQL Serverユーザーは、SQL Server Management Studio(無料でMicrosoftからダウンロード可能)を使用してSQL Serverに接続するか、SQLCMDと呼ばれるツールを介してコマンドラインからコマンドを実行します。

SQLコマンドが実行されているセッションIDを特定できる場合は、実行中のコマンドを停止するセッションを強制終了できます。 SQL Serverには、コマンドの実行中に行われた変更をロールバックするための時間が必要です(「長い」時間になる可能性があります)。

セッションの終了(ソフトウェアによって異なります)は、セッションが終了したことをSQL Serverと通信するのに時間がかかる場合があります。リンクサーバーを使用してSQL ServerからDB2に接続すると、DB2は終了コマンドをバッファリングし、セッションが終了したことをDB2が認識するまでに最大1時間かかることがよくありました。

実行中のセッションを確認するには、次を試してください。

select @@spid;

spid(86と言う)を取得したら、発行できます(許可があるかどうかによって異なります)

kill 86;

ただし、Microsoftの注意事項:セッションIDまたは作業単位(UOW)に基づいたユーザープロセスを終了します。指定されたセッションIDまたはUOWを元に戻す作業が多い場合、特に長いトランザクションのロールバックを伴う場合、KILLステートメントの完了に時間がかかる場合があります。

1