IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Résultat intermédiaire pendant "EXECUTING QUERY"


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut Résultat intermédiaire pendant "EXECUTING QUERY"
    Bonjour,

    parfois, lorsque j'excute une grande query, un résultat intermédiaire est affiché en bas de ma requete, alors que la requête continue a tourner.

    Est-ce normal ?
    Et comment peut-on changer ces paramètres ?

    Car il est peut être fort interessant de déjà visualiser une partie des résulats avant la fin de la requête.

    Merci d'avance.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Difficile à dire sans la requête ou sous squelette.

    S'il s'agit d'une seule requête, c'est probablement un avertissement qui apparaît dans la console (Onglet "Messages").

    S'il s'agit d'un lot contenant plusieurs requêtes, leurs résultars respectifs sont retournés dans l'ordre d'exécution.

    S'il s'agit d'instructions PRINT et que vous ne souhaitez pas attendre pour qu'elles soient affichées dans la console, utilisez RAISERROR('monMessage', 1, 1) WITH NOWAIT

    @++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut
    Merci pour votre réponse.

    Cependant, étant encore novice en SQL, je ne comprends pas trop ou placer votre code RAISERROR('monMessage', 1, 1) WITH NOWAIT, et aussi, que fait-il ?!

    Et pour information, il s'agit d'une seule (grande) requête, sans fonction PRINT.

    Merci pour votre soutien.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    OK, je comprends mieux : en fait SQL Server (le moteur de bases de données) retourne à SQL Server Management Studio (SSMS, la GUI qui permet de naviguer dans les bases de données) les lignes du résultat de votre requête (qui peuvent être très nombreuses) à la vitesse du réseau (ce qui ne signifie pas que votre réseau est lent )
    Ceci fait que votre requête "tourne" toujours alors que des lignes commencent à être affichées dans SSMS

    Pour le RAISERROR, si vous aviez eu plusieurs requêtes qui s'exécutent les une à la suite des autres dans un script par exemple, vous voulez peut-être savoir ou vous en êtes dans l'exécution du script.
    Vous pouvez donc utiliser PRINT, mais cette instruction n'affiche pas votre commentaire dès qu'il est exécuté.
    RAISERROR vous permet normalement de générer des erreurs dans vos procédures stockées ou vos triggers.
    Je vous ai proposé ici une utilisation quelque peu détournée qui permet d'afficher un message immédiatement sans arrêter le traitement en cours

    Merci pour votre soutien.
    Aucun problème, au plaisir de vous recroiser ici

    @++

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par apnw7931 Voir le message
    Bonjour,

    parfois, lorsque j'excute une grande query, un résultat intermédiaire est affiché en bas de ma requete, alors que la requête continue a tourner.

    Est-ce normal ?
    Et comment peut-on changer ces paramètres ?

    Car il est peut être fort intéressant de déjà visualiser une partie des résultats avant la fin de la requête.

    Merci d'avance.
    petite précision :
    Comme vous l'a expliqué elsuket, le moteur renvoi les lignes au client au fur et a mesure.
    Si vous faites une simple requete select dans une grosse table :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * 
    FROM MaGrosseTable
    vous aurez rapidement les premières lignes déjà lues, pendant que le moteur continuera de lire les lignes suivantes...

    Par contre si votre ajoutez par exemple un "ORDER BY" :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * 
    FROM MaGrosseTable
    ORDER BY UneColonne
    le moteur devra d'abord lire l'ensemble des lignes de la table, puis les trier avant de vous renvoyer quoi que ce soit. C'est pourquoi vous avez certaines requêtes qui affichent des lignes avant d'avoir fini leur exécution, et d'autre non !

    Vous pouvez utiliser TOP pour limiter le nombre de résultats et ainsi avoir rapidement un aperçu de ce donne votre requete. Mais Attention

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT TOP 10 * 
    FROM MaGrosseTable
    ORDER BY UneColonne
    Sera toujours aussi long, car le moteur devra lire toute la table, et la trier avant de vous renvoyer les 10 premières lignes.
    Si vous voulez juste un jeu d'essai, vous pouvez faire ainsi :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * 
    FROM (
        SELECT TOP 10 *
        FROM MaGrosseTable
    )AS JeuDEssai
    ORDER BY UneColonne

    Mais attention aux résultats qui risquent d'être faussés, car rien ne vous garantit quelles lignes de votre table seront renvoyé par la sous requete !
    Ça permet juste d'avoir un "aperçu" rapidement de ce que peut donner votre requete...

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bien vu aieeeuuuuu

    On peut aussi avoir un aperçu avec l'option TABLESAMPLE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mesColonnes
    FROM maTable
    TABLESAMPLE (n PERCENT)
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mesColonnes
    FROM maTable
    TABLESAMPLE (n ROWS)
    @++

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bien vu aieeeuuuuu

    On peut aussi avoir un aperçu avec l'option TABLESAMPLE :
    Ha oui, aussi... encore mieux vu

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Si l'affichage des lignes à déjà commencé c'est que la requête est déjà terminée dans le moteur relationnel. Il n'y a que le flux de donnée qui peut mettre du temps à alimenter l'IHM.
    Seule exception, si l'option FASTFIRSTROW a été activée.

    A +

Discussions similaires

  1. Execution macro quoting
    Par lhonolulu dans le forum Macro
    Réponses: 1
    Dernier message: 11/03/2014, 15h28
  2. [MySQL] Insérer résultat d'une requête : problème de quote
    Par maxime17s dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/12/2008, 03h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo