Как остановить выполнение запроса?
Я использую 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)
Примечание: у меня нет разрешения убивать запросы со стороны базы данных.
4 ответов
Я только что наткнулся на 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
:
- действительно быстрее
- получить типы столбцов из БД вместо их угадывания (см. здесь)
- нет
stringsAsFactors
иas.is
аргументы необходимости
большинство пользователей SQL Server используют SQL Server Management Studio (которая бесплатна и может быть загружена из Microsoft) для подключения к SQL Server или выполнения команд из командной строки с помощью средства SQLCMD.
Если вы можете определить идентификатор сеанса, в котором выполняется команда SQL, вы можете убить сеанс, который остановит любую выполняемую команду(команды). SQL Server все равно потребуется время (может быть "долгое" время) для отката любых изменений, внесенных во время выполнения команды.
завершение сеанса (в зависимости от программного обеспечения) может занять некоторое время, чтобы сообщить SQL Server о завершении сеанса. Когда я подключался к DB2 из SQL Server с помощью связанных серверов, DB2 буферизовала команду terminate, и DB2 часто требовалось до часа, чтобы понять, что сеанс был завершен.
чтобы определить, в каком сеансе вы работаете, вы можете попробовать:
select @@spid;
Как только у вас есть spid (скажем, 86) вы можете затем выдайте (в зависимости от того, есть ли у вас разрешение на это)
kill 86;
но, как отмечает Microsoft: Завершает пользовательский процесс, основанный на идентификаторе сеанса или единице работы (UOW). Если указанный идентификатор сеанса или UOW имеет много работы для отмены, оператор KILL может занять некоторое время, особенно если он включает откат длинной транзакции.
попробуйте закрыть "запрос вкладки" в среде SQL Server Management Studio Тогда появится всплывающее окно,
этот запрос выполняется в данный момент. Вы хотите отменить этот запрос ?
отмена в любом случае, выберите "Да".
попробуйте установить соединение перед запросом:
sql = odbcConnect('Database name')
затем используйте ту же строку для запуска запроса:
mydf <- sqlQuery(sql, " myquery ")
ПРИМЕЧАНИЕ: время работы зависит как от базы данных, так и от сервера R, но настройка соединения таким образом должна решить проблему завершения.