Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 03/03/2011, 19h06   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 202
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 202
Points : 13
Points : 13
Par défaut Grosses requêtes depuis un programme c# / MultiThread

Bonjour,

J'ai un programme qui doit executer des grosses requêtes d'extraction (indépendantes) sur une base SQL Server.

Pour gagner en perf, j'ai eu la (mauvaise ?) idée de découper le travail en plusieurs threads qui se chargent chacun d'une requête.
Le CPU est un 4 coeur. J'ai donc créé 4 threads maxi.

Mes questions sont les suivantes:

- Est ce une bonne approche ?
- Y a t il une optimisation à apporter également dans SQL-Server pour tirer profit des architectures multi-coeur ?
- J'ai parfois cette erreur: Expiration du délai d'attente. Le délai d'attente s'est écoulé avant la fin de l'opération ou le serveur ne répond pas. Je pense que la requête est trop longue et qu'au bout d'un moment, sql server jette l'éponge. Existe t il un moyen d'augmenter la valeur de timeout ?

Merci d'avance
boby62423 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 20h36   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
commandtimeout sur la commande si vous êtes en ADO...

qu'utilisez vous pour attaquer votre bdd?
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 22h34   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 202
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 202
Points : 13
Points : 13
Merci mais j'utilise SqlConnection et SqlCommand.
boby62423 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 08h04   #4
Membre éclairé
 
Avatar de jmjmjm
 
Homme Jérémy
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 751
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2005
Messages : 751
Points : 381
Points : 381
Attention si tu fais du multri-thread, tu vas exécuter tes quatre requêtes en même temps, ce qui est ton but, cela ne pose pas de problème à SQL serveur d'exécuter plusieurs requêtes (heureusement). Par contre si tu as des expirations du délais d'attente c'est que tes requêtes doivent exploiter les mêmes données et que ses données doivent être verrouillées par une autre requête. Pour pouvoir t'aider d'avantage, il nous faut la structure de la base et les requêtes que tu veux exécuter.


A plus
jmjmjm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 08h14   #5
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
sqlconnection, sqlcommand=ADO.NET :-)

SqlCommand.CommandTimeOut....

Donnez nous plus détails sur les requète, que font'elle, qu'entendez vous par extraction??

comme le dis jm au cube :-) attention à ce que tes requêtes ne ciblent pas les même données...
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 13h34   #6
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 iberserk Voir le message
sqlconnection, sqlcommand=ADO.NET :-)
comme le dis jm au cube :-) attention à ce que tes requêtes ne ciblent pas les même données...
hmmmm
Je suis pas complètement d'accord avec ça...
visiblement, il s'agit de requête SELECT...
Si deux requêtes ont besoin des même données, une seule lecture sera effectuée, et les données seront "envoyées" aux deux requêtes, ça peut donc être un gain de perfs ...

Pour ce qui est des timeouts, il y a aussi peut être moyen d'optimiser les requêtes !
Quels temps de réponse observes-tu pour les requêtes lancée depuis SSMS par exemple ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 19h25   #7
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Avec quoi n'êtes vous pas d'accord?

Je ne dis que ce n'était pas performant, je dis que si les deux SELECT (comme vous dites...) pointent sur les même tables/données les deux requetes seront plus longues (mais la sommes des deux le serait plus encore...) ce qui peu expliquer qu'il doivent augmenter un peu le CommandTimeOut de sa SqlCommand ADO...
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 19h28   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
une seule lecture sera effectuée
Je n'avais pas vu... là c'est moi qui ne suis pas d'accord... pour la deuxième requête les données seront probablement en cache mais s'il y a deux requêtes différentes il y a forcément deux lectures des données que ce soit de manière physique ou logique...
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 14h57   #9
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 iberserk Voir le message
il y a forcément deux lectures des données que ce soit de manière physique ou logique...
Celle-ci est bien plus rapide que celle-là, qui est à éviter tant que possible !

D'autre part, même si chaque requête engendre une demande de lecture, elles seront mutualisées au niveau du moteur de stockage, pour n'en faire plus qu'une et ainsi optimiser le tout.

Donc le fait que les requêtes ciblent les mêmes données ne sera pas forcément un handicap, voire même pourra être un avantage.

Là où je suis d'accord avec vous par contre, c'est qu'on a trop peu d'informations pour répondre aux questions posées. Il est en effet difficile de résoudre un problème sans en connaitre la cause, et il faudrait donc commencer par savoir pourquoi ces requêtes sont lentes !

Mais globalement, je pense qu'il sera beaucoup plus rentable de chercher à optimiser les requêtes (réécriture, indexation,...) plutôt que de chercher à paralléliser les requêtes. Surtout que SQL server est capable de tirer parti d'un multi-coeur, et peut même paralléliser l’exécution d'une requête donnée, s'il estime que c'est avantageux.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h09   #10
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Mais globalement, je pense qu'il sera beaucoup plus rentable de chercher à optimiser les requêtes (réécriture, indexation,...) plutôt que de chercher à paralléliser les requêtes. Surtout que SQL server est capable de tirer parti d'un multi-coeur, et peut même paralléliser l’exécution d'une requête donnée, s'il estime que c'est avantageux.
+1 dans votre club :-)

Il a de grande chances en effet que les requête ne soient pas optimales...

En revanche même optimisées le timeout par défaut de la commande ADO est de 30 secondes si je ne m'abuse... cela risque de faire juste si le volume des données et/ou la complexité sont important.

Alors est-ce une bonne approche boby62423? si vous ne multithreadez pas vos appels de requètes la seconde ne se lancera qu'après la fin de l'execution de la première...
Comme vous l'explique aieeeuuuuu la seconde, si elle est basée sur les même données sera plus rapide car les données seront en cache...



Peut-on aussi voir vos requêtes ou est-ce indiscret?
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h24   #11
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 769
Points : 17 769
Citation:
Envoyé par aieeeuuuuu Voir le message
Celle-ci est bien plus rapide que celle-là, qui est à éviter tant que possible !

D'autre part, même si chaque requête engendre une demande de lecture, elles seront mutualisées au niveau du moteur de stockage, pour n'en faire plus qu'une et ainsi optimiser le tout.

Donc le fait que les requêtes ciblent les mêmes données ne sera pas forcément un handicap, voire même pourra être un avantage.
Cette technique n'est disponible que dans la version enterprise... (advanced scanning).

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
Vieux 07/03/2011, 15h31   #12
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 SQLpro Voir le message
Cette technique n'est disponible que dans la version enterprise... (advanced scanning).

A +
Connaitre la version de SQL Server est donc une question qui vient s'ajouter à la liste des questions à se poser pour répondre au problème initial de boby62423 (lequel est semble-t-il plongé dans du débogage de multithreading sous C# )
aieeeuuuuu 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 15h38.


 
 
 
 
Partenaires

Hébergement Web