Comment arrêter une requête en cours d'exécution?
J'utilise RODBC pour envoyer des requêtes à un serveur SQL. Parfois, ils prennent trop de temps à courir, donc je dois les annuler.
en cliquant sur le bouton rouge "stop" de RStudio, vous obtenez ce message d'erreur:
R ne répond pas à votre demande d'interrompre le traitement donc d'arrêter l'opération actuelle que vous pourriez avoir besoin de terminer R entièrement.
mettre fin à R entraînera l'interruption immédiate de votre session de R. Actif les calculs seront interrompus et des modifications et les objets de l'espace de travail seront éliminés.
voulez-vous mettre fin à R maintenant?
et si je clique oui, ma session est en effet terminée. (note: utiliser Rgui au lieu de RStudio ne rend pas les choses meilleures)
par contre:
quand j'utilise un autre logiciel (nommé "Query ExPlus") pour me connecter à ce même SQL-Server, j'ai un bouton d'arrêt similaire, et le cliquer interrompt instantanément la requête, sans aucun plantage.
quand je me connecte à une base de données PostgreSQL en utilisant le paquet RPostgres, je peux aussi interrompre la requête à tout moment.
Ces deux points m'amènent à penser qu'il devrait y avoir un moyen de résoudre mon problème. Que puis-je faire?
pour l'instant, ma solution est:
library(RODBC)
library(R.utils)
withTimeout(mydf <- sqlQuery(myconnection, myquery), timeout=120)
Remarque: Je n'ai pas la permission de tuer les requêtes du côté de la base de données.
4 réponses
je viens de tombé sur l' odbc
paquet. Il permet d'interrompre une requête à tout moment.
utilisation de Base qui va comme ceci:
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)
Je n'ai pas une compréhension profonde de ce qui se passe dans les coulisses, mais pour ce que j'ai vu jusqu'à présent dans mon usage personnel ce paquet a d'autres avantages par rapport à RODBC
:
- vraiment plus rapide
- récupérez les types de colonnes du DB au lieu de les deviner (voir ici)
- aucun
stringsAsFactors
etas.is
les arguments nécessaires
la plupart des utilisateurs de SQL Server utilisent SQL Server Management Studio (qui est gratuit et peut être téléchargé depuis Microsoft) pour se connecter à SQL Server ou exécuter des commandes depuis la ligne de commande via un outil appelé SQLCMD.
si vous pouvez déterminer l'id de session dans laquelle la commande SQL est exécutée, vous pouvez tuer la session qui arrêterait l'exécution de n'importe quelle commande. SQL Server aura tout de même besoin de temps (peut-être un "long" temps) pour faire reculer tout changement effectué pendant l'exécution de la commande.
terminer une session (selon le logiciel) peut prendre un certain temps pour communiquer au serveur SQL que la session a été terminée. Lorsque je me suis connecté à DB2 à partir de SQL Server en utilisant des serveurs liés, DB2 amortirait la commande terminer et il faudrait souvent jusqu'à une heure pour que DB2 réalise que la session avait été terminée.
Pour déterminer ce que la session vous sont en cours d'exécution, vous pouvez essayer:
select @@spid;
une fois que vous avez le spid (disons 86) vous pouvez alors question (selon si vous avez la permission de le faire)
kill 86;
essayez de fermer votre "tab query" sur SQL Server Management Studio Alors il apparaîtra pop-up,
Cette Requête est en cours d'exécution. Voulez-vous annuler cette requête ?
Annuler toute façon, choisir "oui".
essayez de configurer votre connexion avant de la requête:
sql = odbcConnect('Database name')
puis utilisez la même ligne pour lancer votre requête:
mydf <- sqlQuery(sql, " myquery ")
Note: la durée d'exécution dépend à la fois de la base de données et du serveur R mais configurer la connexion de cette façon devrait résoudre le problème de terminaison.