Как остановить выполняемый запрос?

Я использую RODBC для отправки запросов на SQL-сервер. Иногда им требуется слишком много времени для запуска, поэтому мне нужно их отменить.

При нажатии красной кнопки "Стоп" в RStudio появляется следующее сообщение об ошибке:

R не отвечает на ваш запрос на прерывание обработки, чтобы остановить текущей операции, вам может потребоваться полностью завершить R.

Завершение R приведет к немедленному прерыванию сеанса R. активный вычисления будут прерваны, а несохраненные исходные файлы будут изменены и объекты рабочей области будут отброшены.

Вы хотите закончить R сейчас?

И если я нажму да, моя сессия действительно прекратится. (примечание: использование Rgui вместо RStudio не улучшает качество)

Однако:

  • когда я использую другое программное обеспечение (с именем "Query ExPlus" ) для подключения к этому же SQL-серверу, у меня есть аналогичная кнопка остановки, и щелчок сразу прерывает запрос без какого-либо сбоя.

  • когда я подключаюсь к базе PostgreSQL с помощью пакета RPostgres, я также могу прерывать запрос в любое время.

Эти два момента заставляют меня думать, что должен быть способ решить мою проблему. Что я могу сделать?

До сих пор мое обходное решение:

library(RODBC)
library(R.utils)

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

Примечание. У меня нет разрешения убивать запросы со стороны базы данных.

Ответы

Ответ 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:

  • действительно быстрее
  • получить типы столбцов из БД, а не угадывать их (см. здесь)
  • no stringsAsFactors и as.is необходимы аргументы

Ответ 2

Большинство пользователей SQL Server используют SQL Server Management Studio (бесплатно и могут быть загружены из Microsoft) для подключения к SQL Server или выполнения команд из командной строки с помощью инструмента SQLCMD.

Если вы можете определить идентификатор сеанса, в котором выполняется SQL-команда, вы можете убить сеанс, который остановит любую исполняемую команду. SQL Server все равно потребуется время (может быть "длинное" время) для отката любых изменений, сделанных во время выполнения команды.

Завершение сеанса (в зависимости от программного обеспечения) может занять некоторое время, чтобы связаться с SQL Server о завершении сеанса. Когда я подключался к DB2 из SQL Server с помощью связанных серверов, DB2 буферизует команду terminate, и для DB2 часто требуется до тех пор, пока DB2 не завершит сеанс.

Чтобы определить, в какой сессии вы работаете, вы можете попробовать:

select @@spid;

когда у вас есть spid (скажем, 86) вы можете затем выдать (в зависимости от того, имеете ли вы разрешение на это)

kill 86;

но, как отмечает Microsoft, Завершает процесс пользователя, основанный на идентификаторе сеанса или блоке работы (UOW). Если для указанного идентификатора сеанса или UOW требуется большая работа по отмене, для выполнения инструкции KILL может потребоваться некоторое время, особенно когда требуется откат длительной транзакции.

Ответ 3

Попробуйте закрыть "запрос табуляции" в SQL Server Management Studio Затем появится всплывающее окно,

Выполняется этот запрос. Вы хотите отменить этот запрос?

Отмените в любом случае, выберите "да".

Ответ 4

попытайтесь установить соединение перед запросом:

sql = odbcConnect('Database name')

Затем используйте ту же строку для запуска вашего запроса:

mydf <- sqlQuery(sql, " myquery ")

Примечание. Время работы зависит как от сервера базы данных, так и от сервера R, но при настройке соединения этот способ должен устранить проблему с завершением.