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

MS SQL Server Discussion :

Comment donner des ordres de priorité à mes requêtes ?


Sujet :

MS SQL Server

  1. #21
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Des nouvelles données nécessaire au calcul des prix sont importées tous les 1/4 d'heure.

    Avant de poster les plan d'exe, sur une de mes requette, le plan me dit
    Index absent (Impact 80.1224) : Create Nonclustered Index ...

    En fait cela concerne une table qui a pour clé primaire 2 champs.

    Que dois-je faire pour optimiser cette base du coup ?

  2. #22
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Le fait que l'optimiseur ait indiqué dans le plan qu'il manque un index caractérise le fait que la requête est à optimiser, mais pas nécessairement qu'il faut ajouter l'index.
    Le mieux est donc que vous collectiez le plan d'exécution réel si vous pouvez vous permettre d'attendre la fin de l'exécution de la requête; à défaut, donnez le plan d'exécution estimé.
    Pour vous aider, vous pouvez vous en remettre à ce petit billet.

    @++

  3. #23
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71

  4. #24
    Membre actif
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Points : 210
    Points
    210
    Par défaut
    Bonjour,

    Avez vous essayer de faire un Select de tout les données en mémoire, ensuite de faire une requette linq sur les données en mémoire (des dataset par exemple) ?
    une fois tout les données sotcker, tout vos update dans une liste et concaténé les a la fin et exécute les en une fois ?

    Normalement vous devriez être suivant le lot de données plusieurs centaine de fois plus rapide, de plus pas de blocage de la base de donnée (une seul requette exécute a la fin)

    Personnellement j'utilise cette méthode et je modifie plusieurs centaine de millier de ligne en qq seconde.

    Si jamais il existe encors une solution encors plus performance, mais il faut passer par une datatable, ensuite vous prenez cette table vous la flusher dans une table temporaire #matabletemps, et vous faite une requette de synchro de cette table vers la table définitive. C'est plus long a écrire, mais c'est ce qui lock la table le moins longtemps et qui donne les meilleurs performances.
    DSI et développeur du logiciel Lulidb
    http://www.lulidb.com - outils de gestion de base de données orienté développer.

  5. #25
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Bonne idée, mais peut-on faire des liaisons (INNER JOIN) entre différentes tables dans un DataSet ?

  6. #26
    Membre actif
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par aloisio11 Voir le message
    Bonne idée, mais peut-on faire des liaisons (INNER JOIN) entre différentes tables dans un DataSet ?
    Vous pouvez utilisé les rowfilter lors de votre boucle, mais une query en Linq sera plus performante.

    DataTable1 : vos données principal
    DataTable2 : vos donnée que vous charger pour chaque ligne

    vous charger toute vos donnée de dataTable1 et de datatable2. ensuite dans votre boucle vous faite un truc du genre (j'ai pas visual studio d'ouvers donc de mémoire et en Vb.Net)

    Dim lRow = (From Row as DataRow in DataTable2.Rows Where Row("Id_Table1") = "monid de ma boucle").ToList

    Ensuite vous avez la liste de row filtrer sur votre Id !

    et vous faite votre commande update que vous concaténé et vous l’exécuter en une seul fois a la fin.
    DSI et développeur du logiciel Lulidb
    http://www.lulidb.com - outils de gestion de base de données orienté développer.

  7. #27
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    au risque de me répéter... pourquoi ne pas simplement une seule requete update pour mettre à jour tous les prix d'un seul coup ?

    Ce serait bien plus efficace et performant.

  8. #28
    Membre actif
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    au risque de me répéter... pourquoi ne pas simplement une seule requete update pour mettre à jour tous les prix d'un seul coup ?

    Ce serait bien plus efficace et performant.
    Il me semblais que vous faisiez un while et que au sein de ce while vous faisiez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
           If CInt(vDrListe("...")) > 0 Then
                                    vSQL &= "UPDATE ..." & _
                                           " SET ... = 0" & _
                                           " WHERE ... = '" & vCode & "';"
                                    ExecuteSQL(vSQL)
                                End If
    donc vous faite x update pour le nombre d'item de votre while, a la place d’exécuter un seul update par boucle vous le concaténé et en sortie de boucle vous faite l’exécution d'une seul requette.
    Maintenant si le Set des champs est identique vous pouvez effectivement modifier votre where et ne fait qu'un update... mais étant donnée que vous avez mis des "..." difficile de savoir exactement ce que vous faite.
    DSI et développeur du logiciel Lulidb
    http://www.lulidb.com - outils de gestion de base de données orienté développer.

  9. #29
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Je vais faire un seul update vous avez raison.

    Par contre pour le LINQ je n'arrive pas.
    Je n'ai pas la méthode AsEnumerable sur les DataTable

  10. #30
    Membre actif
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par aloisio11 Voir le message
    Je vais faire un seul update vous avez raison.

    Par contre pour le LINQ je n'arrive pas.
    Je n'ai pas la méthode AsEnumerable sur les DataTable
    Vous êtes sur ? j'ai ce type d'algo régulièrement et je n'es jamais eu le problème ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim lDT As New DataTable
     
            Dim lRows = From Row As DataRow In lDT.Rows Where Row.Item("ID_MaTable") = 5
    attention c'est bien une datatable et non un dataset ou datareader que vous avez ? sur la datatable vous faite vôtres requettes sur MadataTable.rows ?
    Il me semble dans votre code que ce soit un datareader ... ce n'es pas la même chose.
    DSI et développeur du logiciel Lulidb
    http://www.lulidb.com - outils de gestion de base de données orienté développer.

  11. #31
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    OK ça fonctionne avec .Rows.

    Maintenant comment faire une liaison entre 2 DataTable ?

  12. #32
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    C'est pas évident ces LINQ

    J'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (From TF As DataRow In vDtTF.Rows
                                Where TF("AR_CODE") = vCode
                                Group Join AF As DataRow In vDtAF.Rows
                                On AF.Item("IdArtFour").ToString Equals TF.Item("IdArtFour").ToString
                                Into Group).ToList
    En fait je voudrais que cette requette retourne les infos de AF et Non TF
    Mais si je mets From AF As DataRow In vDtAF.Rows je ne peux plus faire mon WHERE sur TF

  13. #33
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Faites une seule requete UPDATE... dans une procédure stockée !

    apparemment, toutes vos données nécessaires a votre calcul son dans la base de données. ça n'a donc aucun intérêt de rapatrier tout un tas de données vers le client, pour ensuite renvoyer tout un tas d'autres données vers le serveur


    Faites un procédure stockée, qui contient une seule requete update pour mettre à jour vos prix, et appelez simplement la procédure stockée depuis votre programme.

  14. #34
    Membre actif
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Points : 210
    Points
    210
    Par défaut
    Bonjour,

    Il est a mon sens inutile de le regroupé (si j'ai bien compris, mais vous me confirmerez).

    Au passage effectivement si vous récrivez l’intégralité de l'algo en T-SQL, les performance seront meilleur. Mais vous serez liée a Sql Server et vous devez apprendre un nouveau langage.


    Voila ce qui devrai correspondre a peu près a ce que vous chercher a faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    For Each lEntete as DataRow in vDtTF.Rows
     
        Dim lLigne = From Item in vDtAf.Rows Where lEntete.Item("IdArtFour") = Item.("IdArtFour")
        'Faite votre algo ici , lEntete contient les information de l'entete et lLigne contient les informations des lignes
     
    Next
    Citation Envoyé par aloisio11 Voir le message
    C'est pas évident ces LINQ

    J'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (From TF As DataRow In vDtTF.Rows
                                Where TF("AR_CODE") = vCode
                                Group Join AF As DataRow In vDtAF.Rows
                                On AF.Item("IdArtFour").ToString Equals TF.Item("IdArtFour").ToString
                                Into Group).ToList
    En fait je voudrais que cette requette retourne les infos de AF et Non TF
    Mais si je mets From AF As DataRow In vDtAF.Rows je ne peux plus faire mon WHERE sur TF
    DSI et développeur du logiciel Lulidb
    http://www.lulidb.com - outils de gestion de base de données orienté développer.

  15. #35
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Votre plan montre deux problèmes :

    - un Clustered Index Scan : comme l'index cluster pointe à son niveau feuille sur les pages de données de la table, la requête lit toute la table
    - in Index Seek avec RID Lookup : quelques lignes sont récupérées dans ledit index, et le moteur se sert de la valeur de clé de cet index pour aller chercher la valeur d'une colonne qui n'est pas couverte par cet index.

    Pour connaître la différence entre un index cluster et non-cluster, c'est par ici.

    Si le plan d'exécution réel expose des cardinalités pour le moins équivalentes à ce que le plan estimé que vous donnez montre, il est impossible que votre requête soit lente. C'est donc que la maintenance des statistiques n'est pas faite. Par ailleurs je ne vois pas de paramètres, ni leur valeur. Est-ce que lorsque vous soumettez une requête à SQL Server, cela produit un appel à la procédure stockée système sp_executesql ?

    @++

  16. #36
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Uniquement sur 5%/10%.
    Et bien on a inventé la clause where pour ca! voir des jointures!
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. comment ajouter des infos projet sur mes JSP
    Par legad dans le forum Maven
    Réponses: 1
    Dernier message: 12/02/2008, 15h45
  2. comment donner des arguments au main()
    Par adel.87 dans le forum Débuter
    Réponses: 3
    Dernier message: 23/12/2007, 21h22
  3. Comment donner des droits sur tous les objets d'un schéma
    Par farenheiit dans le forum Administration
    Réponses: 2
    Dernier message: 07/06/2007, 16h27
  4. comment donner des couleurs au ligne d'un DBgrid
    Par tchimou dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/05/2007, 01h50
  5. Réponses: 8
    Dernier message: 13/09/2006, 17h21

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