Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/01/2011, 13h11   #1
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 125
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 125
Points : 19
Points : 19
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.
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/01/2011, 04h08   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 707
Points : 8 707
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 09h41   #3
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 125
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 125
Points : 19
Points : 19
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.
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 10h37   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 707
Points : 8 707
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

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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 11h20   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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 :
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 :
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 :
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 13h41   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 707
Points : 8 707
Bien vu aieeeuuuuu

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

Code :
1
2
3
SELECT mesColonnes
FROM maTable
TABLESAMPLE (n PERCENT)
Ou encore :

Code :
1
2
3
SELECT mesColonnes
FROM maTable
TABLESAMPLE (n ROWS)
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 14h34   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 21h18   #8
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 766
Points : 17 766
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 +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h48.


 
 
 
 
Partenaires

Hébergement Web