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

Accès aux données Discussion :

Tirer parti du dual core pour executer une série de requêtes


Sujet :

Accès aux données

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 27
    Points : 21
    Points
    21
    Par défaut Tirer parti du dual core pour executer une série de requêtes
    Bonjour,

    je développe actuellement un programme en C# qui travaille avec une base de données sous SQL server 2000.

    Mon SQL server 2000 est correctement configuré pour tirer parti de mes 2 processeurs.

    Dans mon programme j'ai une liste de 200 000 strings qui correspondent à des requêtes SQL dans valeur de retour que je dois faire executer dans ma BD quelque soit leurs ordres de traitements.

    en ouvrant une connexion et en balançant séquentiellement les requetes apr. un exécute non-query je m'aperçois que SQL Server ne tire parti que d'un seul processeur.

    J'avais pensé à créer plusieurs threads qui ouvrait plusieurs connections mais avant de faire cela je voudrais être sur mon problème vienne du fait que SQL server n'attribue qu'un seul processeur à une seule connexion.


    Quelles seraient vos idées pour que je puisse balancer mes 200 000 requêtes SQL UPDATE en passant par du code C# et de la façon la plus optimisé possible ?

    Merci

  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Salut

    Pour des operations d'insertions basiques, c'est rarement le processeur du serveur SQL qui est un goulot d'etranglement, c'est presque toujours le sous systeme disque. Si tu as un array de 8 disques scsi en raid 10 et un processeur poussiereux, il se pourrait que le processeur pose probleme.

    Dans tous les cas il faut, pour que tu puisse optimiser, savoir ou se trouve le goulot d'etranglement: reseau, vitesse d'emission des requetes de la part du client, vitesse de traitement des requetes par le serveur... Et tout depend de ton environnement materiel specifique. Il n'y a pas de reponse toute faite, et la solution c'est d'etudier finement les etudier les compteurs de SQL Server et d'ADO.NET sur le client

    Le premier lien donne deja un bon conseil pour des insert en masse:

    So which option is best? In all cases, you will still be producing a lot of disk I/O. There is no way to get around this if you deal with 1,000,000 rows. But by using one or just a few transactions, you reduce the number of log flushes significantly, and disk I/O is reduced significantly, which helps to reduce the I/O bottleneck, boosting performance.
    Enfin sur le client, l'erreur bateau c'est de faire des concatenations de strings sans StringBuilder

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 27
    Points : 21
    Points
    21
    Par défaut
    merci pour ta réponse,

    alors pour le problème qui était qu'un seul processeur n'était utilisé j'ai résolu le problème en passant une de mes bases de données sur un serveur SQL 2005 et en envoyant les requête d'UPDATE et INSERT en asynchrone grace à la méthode beginExecuteNonQuery.

    Ca me fais déja gagné pas mal de temps.


    Mais j'ai regardé tes liens et je suis sur que je vais encore gagner de precieux cycles CPU.

    Si d'autres personnes ont des astuces je suis preneur car j'ai encore beaucoup d'optimisation à faire pour que le délai soit correct

  4. #4
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    1)utiliser des index.

    2) ensuite une erreur difficile a percevoir :
    verifie si dans tes stored procedures si tu utilises des functions dans des group by et bien les functions a ce moment la casse l'indexation.
    donc il te faut faire la chose suivante

    set uneVariable = MaFunction(...);

    puis groupby uneVariable.

    il y en encore bcp mais celui dont je te parle n'est pas evident a deceler et pas forcement tres connu. (en tout cas moi a une epoque cea m'avais bien embeter).

Discussions similaires

  1. le temps passé pour executer une requete
    Par sefir dans le forum Requêtes
    Réponses: 3
    Dernier message: 30/11/2007, 12h04
  2. [C] code pour executer une commande shell
    Par waldoun dans le forum Linux
    Réponses: 3
    Dernier message: 05/05/2007, 23h41
  3. Réponses: 2
    Dernier message: 01/09/2006, 01h02
  4. Pb pour executer une procédure sous SQL PLUS
    Par rabddoul dans le forum Oracle
    Réponses: 4
    Dernier message: 21/10/2005, 16h40
  5. [MySQL] Afficher le temps mis pour executer une requête SQL
    Par micatmidog dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 28/09/2005, 12h23

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