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 :

[SQL Server] Requete SQL lente


Sujet :

Accès aux données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 137
    Par défaut [SQL Server] Requete SQL lente
    Bonjour,

    Je développe en VB .net, a l'aide de la technologie windows Forms, sur le SGBD SQL Server.
    J'ai récemment fais l’acquisition d'un serveur dédié hébergé chez OVH.

    En local, tous se déroulais parfaitement, les traitements étaient rapide (jamais plus de 5sec).

    Seulement, depuis que le logiciel va chercher les informations sur le serveur, certaines requêtes durent plus d'une minute, ce qui n'est pas tolérable. J'ai donc commencer a optimiser mes requêtes. Et c'est alors que j'ai compris la vraie nature du problème.
    Une requête simple s’exécute rapidement, a quasiment la même vitesse qu'en local. Le problème provient de l’exécution de double requete, je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    objDR = requeteSELECT("SELECT * FROM TbAtt WHERE FinW<='" & dateJusque & "'"
    objDR.read
    wsExcel.Cells(14 + compteur, 2) = objDR.Item(17)
    wsExcel.Cells(14 + compteur, 3) = RequeteINFOAlt1("CodeAtt", "TbCodeAtt", "IDCodeAtt", objDR.Item(5))
    La première ligne, provenant de la première requête, s’exécute sans problème.
    La seconde quant à elle, prend plus de 5 sec à s’exécuter, sachant que ce code est contenu dans une boucle while, les temps de réponses atteignent vite la minute.

    Concernant l'optimisation de cette requête, j'ai tout bonnement supprimé la seconde, j'ai rentré le contenu de la table dans un tableau, et ainsi j'ai pu retrouver un temps d’exécution correct.

    Sauf que, entrer toute les donné dans un tableau n'est pas toujours possible. Une table fais 36k ligne, bien qu'elle ne soit pas excessivement lourde, la traiter par le code me semble assez conséquent !

    J'ai eu dans l’après midi un technicien d'OVH qui m'as proposer 2 choses :
    - Optimiser mes requêtes SQL, ce que j'avais commencer a faire, mais qu'il semble compliquer a réaliser sans perdre d'info, ou sans perdre de rapidité.
    - Éventuellement configurer SQL Server pour ce genre de traitement.

    Etant assez novice dans la configuration d'un serveur, je n'y avais absolument pas touché. Mais je me demande si je n'aurais pas du...
    Ce qui me surprend le plus dans cette histoire, c'est qu'en local avant, même sur une machine vraiment peu puissante, les traitement étaient très rapide. Pensant que le souci venais de notre ADSL, j'ai fais un speedTest, et j'ai obtenu un résultat de 10Mbps, pas de souci donc, et le serveur est lui aussi correctement desservi (fibre).
    Je fais donc appel aux habitué de ce SGBD, si il y a une solution miracle par la configuration, ou si il n'y a pas de secret et qu'il faut minimiser les traitements au maximum.

    Merci a vous !

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    L'optimisation de requêtes SQL n'est pas une science exacte, il existe autant de solutions possibles qu'il existe de requêtes, c'est-à-dire une infinité

    Tu peux déjà vérifier de ton côté :
    • La présence d'un index sur la colonne FinW dans la table TbAtt. S'il n'y en a pas, il faut en mettre un.
    • Utilise une requête paramétrée (tuto ou faq) afin de figer le plan d'exécution et obtenir des performances plus stables.


    Peux-tu également préciser ce que tu fais dans la méthode Read ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 137
    Par défaut
    Bonjour,

    La présence d'un index sur la colonne FinW dans la table TbAtt. S'il n'y en a pas, il faut en mettre un.
    Je ne comprend pas très bien ce que tu nomme un index sur ce champs. Le champs FinW est un champs Date, pour moi lui coller un index implique d'exporter les données dans une autre table, et de l’identifier avec l'index. Sauf que ce champs est un champs date et différents pour quasiment chaque ligne de la base. Es ce bien ce dont tu parle ?

    Utilise une requête paramétrée (tuto ou faq) afin de figer le plan d'exécution et obtenir des performances plus stables.
    Je suis en train de m'y mettre, merci pour les liens.

    Peux-tu également préciser ce que tu fais dans la méthode Read ?
    ObjDR est un objet de type System.Data.SqlClient.SqlDataReader, la méthode read permet de passer a la ligne suivante du tableau. Classiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    objDR = Requete
    objDR.read
    textbox1.text = objDR.item(0)
    while objDR.read
    textbox1.text = textbox1.text & vbnewline & objDR.item(0)
    end while
    Merci pour ta réponse. Je vais faire des tests avec les requête paramétrer (qui m'ont quand même l'air un peu plus complexe qu'une requête bidon !), et de voir si je gagne du temps.

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Ninpa Voir le message
    Je ne comprend pas très bien ce que tu nomme un index sur ce champs. Le champs FinW est un champs Date, pour moi lui coller un index implique d'exporter les données dans une autre table, et de l’identifier avec l'index. Sauf que ce champs est un champs date et différents pour quasiment chaque ligne de la base. Es ce bien ce dont tu parle ?
    Non pas du tout. Un index peut être assimilé à un annuaire téléphonique : pour chercher un numéro de téléphone associé à un nom de famille, tu n'es pas obligé de parcourir tout l'annuaire, tu peux directement aller à la première lettre du nom de famille, puis fouiller par ordre alphabétique. Cela va donc beaucoup plus vite que si tu devais parcourir tout l'annuaire à la recherche de l'information qui t'intéresse.

    Dans ton cas c'est pareil : tu cherches une date précise (le nom de famille) parmi tous les enregistrements contenus dans la table (l'annuaire).

    Donc sans index sur la colonne, le SGBDR va devoir parcourir tous les enregistrements (ce qui s'appelle un Full Scan), puis filter pour ne remonter que les lignes correspondant à la date recherchée.
    Avec un index, le SGBDR va consulter l'annuaire et il saura précisément où chercher.

    Voilà pour te donner une image de ce qu'est un index. Je te laisse le soin de te documenter : Indexer avec SQL-Server... oui mais quoi ? ou encore : CREATE INDEX (Transact-SQL).

    En tout cas, pas besoin de créer une nouvelle table, l'index s'applique sur une (ou plusieurs colonnes) dans une table donnée. Le contenu de l'index est stocké au niveau du disque dur.

    En tout cas ça peut permettre de booster les requêtes de manière significative.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 137
    Par défaut
    Merci encore a toi pour toutes tes réponses très précises, je devrais m'en sortir maintenant !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete SQL sous MS SQL Server
    Par siva27 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 31/01/2014, 10h34
  2. [SQL server] requete sql join/union?
    Par Alex35 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/11/2007, 16h45
  3. [SQL Server] requete sql 'where'
    Par khayate dans le forum Langage SQL
    Réponses: 18
    Dernier message: 25/05/2007, 16h42
  4. Réponses: 2
    Dernier message: 04/11/2006, 00h33
  5. Requete SQL sur base SQL Server VB6
    Par Yanmeunier dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 25/11/2005, 12h30

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