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

Bases de données Delphi Discussion :

Problème performance SQL Server Delphi


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2003
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2003
    Messages : 58
    Par défaut Problème performance SQL Server Delphi
    Bonjour,

    J'ai développé une application de gestion de stock avec Delphi 6. La base de données est sous SQL Serveur. L'ouverture d'un table (TADOTable.Open) qui est lie à une vue (view) de la base de données prend sur le PC de développement (pour un résultat qui retourne 23000 linges) quelques secondes (2-10 seconds) mais sur le Serveur de production plus de 10 minutes.

    voici ci-dessous la requête SQL qui générée la vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    SELECT     dbo.CDM.CBCDM, dbo.PRD.Designation, dbo.CDM.CodePRD, dbo.CDM.CodeInventaire, 
                          dbo.CDM.NumSerieCDM, dbo.CLS.LibelleCLS, dbo.CTGR.LibelleCTGR, 
                          dbo.CDM.EtatCDM, dbo.CDM.DateR, dbo.DR.PrixAchatHT, 
                          dbo.FRS.RS AS RSFRS, dbo.CDM.Observation, dbo.DPT.CodeDPT, dbo.DPT.LibelleDPT, 
                          dbo.MGZ.CodeMGZ, dbo.MGZ.LibelleMGZ, dbo.CMPT.LibelleCMPT, dbo.RYN.LibelleRYN, 
                          dbo.ETGR.LibelleETGR, dbo.TM.LibelleMVT AS MvtR, dbo.CDM.NumR, 
                          TM_1.LibelleMVT AS MvtSRT, dbo.SRT.NumSRT, dbo.SRT.DateSRT, dbo.SRT.LibelleNV, 
                          dbo.PRT.RS AS RSPRT, dbo.R.TypeR, dbo.SRT.Agent AS AgentSRT, 
                          dbo.R.Agent AS AgentR, dbo.CDM.CDMStatut, dbo.CDM.DatePeremption, 
                          dbo.CDM.PrixUnitaireR, dbo.CDM.QuantiteStock, dbo.CDM.QuantiteR
    FROM         dbo.FRS RIGHT OUTER JOIN
                          dbo.DRC INNER JOIN
                          dbo.R INNER JOIN
                          dbo.DR ON dbo.R.NumR = dbo.DR.NumR INNER JOIN
                          dbo.TM ON dbo.R.TypeR = dbo.TM.TM ON 
                          dbo.DRC.NumR = dbo.DR.NumR AND 
                          dbo.DRC.CodePRD = dbo.DR.CodePRD LEFT OUTER JOIN
                          dbo.PRT ON dbo.R.CodePRT = dbo.PRT.CodePRT ON 
                          dbo.FRS.CodeFRS = dbo.R.CodeFRS RIGHT OUTER JOIN
                          dbo.DS INNER JOIN
                          dbo.DSC ON dbo.DS.NumSRT = dbo.DSC.NumSRT AND 
                          dbo.DS.CodePRD = dbo.DSC.CodePRD INNER JOIN
                          dbo.SRT ON dbo.DS.NumSRT = dbo.SRT.NumSRT INNER JOIN
                          dbo.TM AS TM_1 ON dbo.SRT.TypeSRT = TM_1.TM RIGHT OUTER JOIN
                          dbo.ETGR RIGHT OUTER JOIN
                          dbo.CDM ON dbo.ETGR.CodeETGR = dbo.CDM.CodeETGR LEFT OUTER JOIN
                          dbo.CLS INNER JOIN
                          dbo.SC ON dbo.CLS.CodeCLS = dbo.SC.CodeCLS INNER JOIN
                          dbo.CTGR ON dbo.CLS.CodeCTGR = dbo.CTGR.CodeCTGR RIGHT OUTER JOIN
                          dbo.PRD ON dbo.SC.CodeSC = dbo.PRD.CodeSC LEFT OUTER JOIN
                          dbo.MRQ ON dbo.PRD.CodeMRQ = dbo.MRQ.CodeMRQ ON dbo.CDM.CodePRD = dbo.PRD.CodePRD ON 
                          dbo.DSC.CBCDM = dbo.CDM.CBCDM AND 
                          dbo.DSC.NumR = dbo.CDM.NumR ON 
                          dbo.DRC.CBCDM = dbo.CDM.CBCDM AND 
                          dbo.DRC.NumR = dbo.CDM.NumR LEFT OUTER JOIN
                          dbo.RYN ON dbo.ETGR.CodeRYN = dbo.RYN.CodeRYN LEFT OUTER JOIN
                          dbo.CMPT ON dbo.RYN.CodeCMPT = dbo.CMPT.CodeCMPT LEFT OUTER JOIN
                          dbo.MGZ ON dbo.CMPT.CodeMGZ = dbo.MGZ.CodeMGZ LEFT OUTER JOIN
                          dbo.DPT ON dbo.MGZ.CodeDPT = dbo.DPT.CodeDPT
    J'ai eu le même problème de lenteur sur un autre PC qui tourne sous Windows7 avec SQL Serveur 2008.

    Voici un résume de temps d'exécution de la même requête avec la même quantité de données :

    Developpement (laptop HP): Windows XP-SP3 + SQL Server 2005 : 2-6 secs
    Developpement (laptop HP): Windows XP-SP3 + SQL Server 2008 : 2-6 secs
    Teste (laptop Acer): Windows 7 + SQL Server 2008 : plus de 12 minutes
    Production (Server HP): Windows 2003 server + SQL Server 2005 : plus de 12 minutes

    Je suis vraiment bloqué à cause de ce problème de lenteur .

    Merci d'avance pour votre aide.

    Cdt,
    Burkan

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Je pense que c'est surtout la requête qui est à revoir complètement.

    Ne connaissant pas le modèle de données de ta base je ne peux faire que des remarques :

    - Trop de LEFT et RIGHT (sont ils tous obligatoire ?)
    - As tu besoin de toute ces tables ? (Ex : DS et DSC ne sont pas appeler dans la partie haute de la requête est ce bien utile de passer par ces deux tables ? ne pourrait on pas faire une jointure avec DR ou DRC directement ?)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 083
    Par défaut
    Est-ce que toutes les bases de tests sont identiques ?
    Surtout sur les Index ?
    Ensuite, c'est effectivement une Uzinagaz cette requète, autant de table, autant de champ ?
    A quoi cela sert ? Si c'est pour mettre dans une grille, c'est inbuvable, passer 10 colonnes, c'est tué l'utilisateur, mieux vaut lancer une requête pour la grille avec 10 colonnes + PK, puis lors de l'appel d'un formulaire d'édition avancé, lancer quelques requêtes en utilisant les PK pour récupérer les données manquantes !

    Cette vue est-elle utiliser massivement pour faire des calculs ?
    Perso, j'utilise MySQL 4 et parfois 5 donc je suis pas un habitué des vues mais c'est surtout au CREATE VIEW que cela prend du temps, après, c'est un peu commet lire une table ?
    Comment fonctionne SQL Server pour les vues, il relance la requête à chaque lecture ?


    je trouve aussi la requête pénible à lire, on ne voit pas les join du 1er coup d'oeil

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FROM dbo.FRS 
       RIGHT OUTER JOIN dbo.DRC 
       INNER JOIN dbo.R
       INNER JOIN dbo.DR ON dbo.R.NumR = dbo.DR.NumR 
       INNER JOIN dbo.TM ON dbo.R.TypeR = dbo.TM.TM 
       ...
    Pour les Join sans on, je suppose qu'il y a une complétion implicite sur les PK par SQL Server ? comme le NATURAL JOIN ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2003
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2003
    Messages : 58
    Par défaut
    Bonjour ShaiLeTroll & Rayek,

    L'exécution de la même requête (même base de données) sur les deux systèmes "Windows 7 & Windows 2003 Server" nécessite plus de 12 minutes , alors que sur Windows XP elle termine l'exécution dans moins de 6 secondes.

    Pour cette raison que je crois que le problème n'est pas la requête mais mon exécutable. Je note aussi que la requête nécessite moins de 2 seconds avec SQL Server Studio Manager. ce qui peut être confirme que la source du problème est l'application.

    Mais la même application tourne sur XP sans aucun problème .

    Question: est il nécessaire que le système sur le quel Delphi est installé doit être le même que le système où mon future application sera installé pour avoir les meilleures performances de cette dernière?


    Merci d'avance pour l'aide

    Cdt,
    Fouad

  5. #5
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Bonjour

    afin de lever toute ambiguïté je te propose de faire une simple requête genre
    select * from taTable
    et de l'exécuter sous tes différents OS, si elle s'exécute dans les mêmes délais alors le problème est dans ta requête sinon dans le système.

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Les bases où tu fais tes tests sont elles totalement identique ?
    Est ce que les tables ont le même nombre d'enregistrement ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

Discussions similaires

  1. Problème performance SQL Server Delphi
    Par burkan dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/08/2010, 10h38
  2. Performance SQL Server - lot DTS
    Par arno_web dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/01/2006, 14h30
  3. Problème Curseur SQL SERVER
    Par Yanmeunier dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/12/2005, 19h19
  4. Problème installation SQL Server 2000 (programme antérieur)
    Par 404Found dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/04/2005, 10h24
  5. Problème réplication SQL Server et SQL Server CE (RDA)
    Par didix11 dans le forum Réplications
    Réponses: 2
    Dernier message: 15/04/2004, 11h10

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