Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

nessi

Killer une requête SQL

Messages recommandés

Salut !

 

J'ai un algorithme qui envoie un certains nombre de requêtes SQL à un serveur Oracle. Ces requêtes peuvent prendre plusieurs minutes avant de rendre la main.

 

Pour éviter que l'appli se 'givre', j'ai utilisé un thread. Le problème c'est que si je veux annuler le processus, il faut que j'attende que la requête se termine avant que le thread reprenne son exécution et se termine.

 

Je voulais savoir s'il existe une API qui permet de killer la requête en cours (ou la connexion) ou de stopper l'exécution (plus propre :P)

 

Merciiiiiiiiiii

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut !

 

J'ai un algorithme qui envoie un certains nombre de requêtes SQL à un serveur Oracle. Ces requêtes peuvent prendre plusieurs minutes avant de rendre la main.

 

Pour éviter que l'appli se 'givre', j'ai utilisé un thread. Le problème c'est que si je veux annuler le processus, il faut que j'attende que la requête se termine avant que le thread reprenne son exécution et se termine.

 

Je voulais savoir s'il existe une API qui permet de killer la requête en cours (ou la connexion) ou de stopper l'exécution (plus propre :))

 

Merciiiiiiiiiii

Il n'existe pas d'API qui permette de "killer" une requête.

Il faut que tu revoies ta façon de procéder (communication d'un thread à l'autre pour savoir s'il faut continuer à lancer les requêtes ou s'il faut faire le rollback tout de suite) parce qu'il est techniquement et philosophiquement impossible de demander ça à Oracle (ça va à l'encontre du concept d'atomicité)

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut KewlCat,

 

Merci pour ta réponse, mais je crois que je me suis mal expliqué:

 

Je communique déjà avec mon thread, mais que je lui dise d'arrêter ou non, ça n'y changera rien, puisque l'objet qui envoie la requête au serveur est 'bloquant'.

Il faut donc que la requête se termine avant de passer à la ligne suivante et de prendre en compte ma demande d'arrêt.

 

Le problème est qu'une requête peut prendre de 15 minutes à plusieurs heures à s'exécuter. Pendant ce laps de temps, si je demande l'arrêt du thread, celui-ci ne prendra en compte ma demande que lorsque la requête sera terminée.

 

En ce qui concerne le principe d'atomicité, ce que je demande ne va pas à l'encontre de ce concept, seulement toutes mes requêtes non commité ne seront pas prise en compte par Oracle et de toute manière, je ne fais pas réellement de transaction.

 

Quand je dis "killer", je veux juste demander à Oracle d'arrêter l'exécution de la requête (quitte à attendre qu'il fasse son rollback, ce sera toujours moins long que d'attendre la fin de l'exécution et de faire un rollback par la suite).

ça je sais que c'est possible car le logiciel que j'utilise pour accèder aux base de données (TOAD) le fait.

 

Je parlais d'API mais il y a peut être juste une commande à envoyer au serveur.

 

Donc, je repose ma question, "Quel est le moyen d'arrêter l'exécution d'une requête en cours ?"

 

Un moyen serait de "killer" (et là c'est réellement killer :P) la session utilisée ce qui annulerait l'exécution de la requête et renverrait une erreur à mon application et en même temps me permettrait de reprendre la main.

 

Voilouuu, ben si vous avez des idées...

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est une et une seule requête qui met 15 minutes à s'exécuter ?!?

Y'a un problème... En tout cas, c'est problématique parce que je crois que par défaut sous Oracle le timeout avant un rollback et l'abandon d'une session inactive, c'est 15 minutes :-P

 

Pour le reste, je n'ai pas la moindre idée de la façon de procéder pour "killer" une session afin de récupérer la main sur une requête en cours. Je répète que cela va à l'encontre de ce pour quoi Oracle a été prévu. (Un peu comme si tu nous demandais comment comment garer ta voiture dans ton parking sans avoir à attendre que le portail automatique ait fini de s'ouvrir, tu vois ?)

 

Tu ne peux vraiment pas découper ta grosse requête ?

S'il s'agit d'un programme destiné à tourner fréquemment, pourquoi ne pas l'insérer à la liste des batches qui tournent la nuit ? Ca ne gêne personne d'avoir un programme de 15 minutes la nuit... (il faut voir avec l'équipe en charge de l'exploitation)

 

Est-ce que tu peux nous éclairer un peu sur le contexte, avant de continuer ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Est-ce que tu peux nous éclairer un peu sur le contexte, avant de continuer ?

 

Salut KewlCat,

 

Effectivement, je crois que je vais préciser le contexte :-(. Mais accroche-toi :-P

 

Alors, voilà, je fais un logiciel pour 'épurer' des bases de données. Le but est de sélectionner une table à épurer, choisir une requête de sélection pour filtrer les lignes de la table qu'il faut nettoyer. Par la suite, le logiciel détermine les relations (références) avec les autres tables de la base de données et épure les enfants en récursif.

 

Alors, forcément tu vas me dire que je me fais chiez pour rien et qu'Oracle peut faire exactement la même chose en utilisant le 'DELETE ON CASCADE'. Sauf que la base de données ne respecte les contraintes d'intégrités référentielles, il n'existe donc AUCUNE REFERENCE physique entre les tables et donc aucun moyen pour Oracle de déterminer les relations entre les tables. Moi je dispose de la définition de ces références que j'ai importé à partir d'un fichier XML généré par le logiciel Power AMC. Je me base dessus pour déterminer les relations dans mon algorithme.

 

Je précise que la base de données contient 800 tables et que certains tables contiennent des milliers de lignes, voir même des millions !

Je peux t'assurer que c'est tout à fait logique qu'une requête prenne plus de 15 minute, voir même plus d'une heure ! Ce n'est pas du tout problématique avec le timeout et la déconnexion de session inactive, car une session n'est définit comme inactive que si aucune requête n'a été lancée pendant un certains temps et ce n'est pas mon cas puisque la requête s'exécutant, la session reste active.

 

Au sujet de la métaphore du parking (que j'ai bien aimé d'ailleur :-P), je la verrai plutôt comme ça : Je vous demande plutôt comment sortir du parking avant que je me sois garé. :-P

 

Ceci dit, j'admet que ce n'est pas orthodoxe de "killer" une session. Mais, lorsque je "kill" une session via TOAD, ce n'est pas du côté d'oracle que celà cause problème. Lui se contente d'annuler l'exécution de la requête et de faire le rollback. Donc aucun souci pour lui (et c'est normal).

 

 

Tu ne peux vraiment pas découper ta grosse requête ?

 

ça va pas non ! on se connait à peine !! quoi ? 'requête' ? Ha oui j'avais mal lu :P

 

Ben non, je peux pas découper ma grosse requête. D'autant plus que 99% des requêtes envoyées sont générées automatiquement par l'algo et je me suis détruit le cerveau à trouver la meilleure structure possible.

 

 

S'il s'agit d'un programme destiné à tourner fréquemment, pourquoi ne pas l'insérer à la liste des batches qui tournent la nuit ? Ca ne gêne personne d'avoir un programme de 15 minutes la nuit... (il faut voir avec l'équipe en charge de l'exploitation)

 

Je peux rien te cacher. Effectivement, c'est prevu de tourner la nuit, et le week-end. Alors c'est vrai que l'annulation ne se pose pas vraiment, mais j'aimerai bien trouver un moyen d'arrêter l'exécution de la requête, juste pour m'endormir moins con au moins un soir :-P

 

J'espère que tu vois un peu plus ce que je veux faire,

si t'as une idée, jsui preneur

Modifié par nessi

Partager ce message


Lien à poster
Partager sur d’autres sites

Haaan

la base de données ne respecte les contraintes d'intégrités référentielles,
Faudrait vraiment expliquer aux gens qu'il est inutils de payer bien cher Oracle si c'est pour l'utiliser comme des porcs. (soupir)
Moi je dispose de la définition de ces références que j'ai importé à partir d'un fichier XML généré par le logiciel Power AMC. Je me base dessus pour déterminer les relations dans mon algorithme.
A priori, inutile de te demander si tu as ajouté les indexes sur les colonnes qui vont bien pour que tout fonctionne plus rapidement, je devine déjà la réponse (entre 15min et 1h pour faire le ménage dans 800 tables de plusieurs centaines de milliers d'enregistrements, c'est forcément déjà optimisé) ;-)
Ceci dit, j'admet que ce n'est pas orthodoxe de "killer" une session. Mais, lorsque je "kill" une session via TOAD, ce n'est pas du côté d'oracle que celà cause problème.
Tiens, c'est peut-être une piste à suivre : contacter les gens qui développent TOAD ou ceux qui développent TORA ( http://www.globecom.se/tora/ ) pour leur demander comment ils font !

 

Malheureusement, je n'ai pas de meilleure idée :-/

Partager ce message


Lien à poster
Partager sur d’autres sites
Faudrait vraiment expliquer aux gens qu'il est inutils de payer bien cher Oracle si c'est pour l'utiliser comme des porcs. (soupir)

 

totalement d'accord avec toi. Encore que 'porcs' est un peu trop euphémique :-P

 

A priori, inutile de te demander si tu as ajouté les indexes sur les colonnes qui vont bien pour que tout fonctionne plus rapidement, je devine déjà la réponse

 

ben j'ai beaucoup réfléchit à la manière d'optimiser le tout. Par chance, les index sont quasiment présents dans toutes les tables (c'est déjà ça). J'ai essayé de voir pour créer automatiquement des index pour le traitement, mais en définitive, le temps de créer l'index et de le supprimer par la suite prendrait parfois plus de temps qu'exécuter la requête sans index. Alors j'y ait pas trop touché :-P

 

(entre 15min et 1h pour faire le ménage dans 800 tables de plusieurs centaines de milliers d'enregistrements, c'est forcément déjà optimisé) :P

 

comme j'aimerai que ce soit aussi rapide :-( Malheureusement, c'est une heure pour épurer UNE SEULE table et non le tout. Bien entendu, c'est le cas pour de très grosses tables mais je peux pas y faire grand chose. Après, ça dépend du plan de travail qu'adopte Oracle. Parceque mes requêtes, elles, sont toutes simples (c'est juste des jointures).

 

 

Je crois que je vais suivre ton idée, et demander aux développeurs, mais je doute qu'ils me répondent...

 

Si à l'occasion, comme ça, pouf, t'as une idée qui te vient à l'esprit, hésite pas à la poster :-P

 

 

Merci pour ton aide

Modifié par nessi

Partager ce message


Lien à poster
Partager sur d’autres sites
Si à l'occasion, comme ça, pouf, t'as une idée qui te vient à l'esprit, hésite pas à la poster :D

Bin, à moins qu'il ne me prenne l'envie d'éplucher les sources de TORA pour voir comment c'est fait, je pense que je n'aurai pas d'idée lumineuse pour résoudre ton problème... Comme je l'ai peut-être déjà dit plus haut, je n'ai jamais travaillé en stoppant des requêtes qui étaient en cours d'exécution...

 

Bonne chance, en tout cas.

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.

×