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

Développement SQL Server Discussion :

optimiser requete, la vue le probleme ?


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut optimiser requete, la vue le probleme ?
    Bonjour

    J'aimerais optimiser une requete/procedure stockee.

    Voici un peu le contexte:

    Ma procedure stockee cree une requete dynamiquement car elle recoit des parametres pour creer la clause where
    A la fin je l'execute avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC sp_executesql @SQLQuery
    Ma procedure stockee est utilisee pour alimenter un datasource (qui alimente un GridView)

    D'apres mes recherches, sous ASP.NET, pour ne pas faire un select entier pour le GridView lorsqu'on veut afficher que 10 records par page, il faut utiliser la methode du Custom Paging qui consiste a utiliser la procedure ROW_NUMBER() que j'utilise donc.
    Cette technique marche tres bien, je l'ai essaye sur une table de 30 000 entrees et ca va tres vite.
    Le probleme c'est que quand j'utilise la meme technique sur ma Vue de 1900 entrees, c'est plus long...

    Voici les donnees du Profiler:
    -procedure en rapport avec la table d'environ 30 000 entrees:
    CPU: 47
    reads: 1258
    duration: 40

    -procedure en rapport avec la Vue d'environ 1900 entrees:
    CPU: 590
    reads: 48055
    duration: 589

    Donc je pense que je peux ameliorer ma requete en rapport avec ma Vue...
    - soit reecrire ma Vue car j'ai beaucoup de sous requetes
    - soit utiliser directement la table et non la vue et faire des sous requetes ensuite une fois que j'ai ramene que mes 10 records grace au Row Number ?

    Voici la structure de ma vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT     ID, 
                            Champ1ID,
                            (SELECT     dbo.FormatterTexte(LTRIM(RTRIM(FirstName)) + ' ' + LTRIM(RTRIM(LastName))) AS Name
                                FROM          dbo.Table2
                                WHERE      (ID = dbo.Table1.Champ1ID)) AS Champ1Name
                             ....... + 10 autres Select comme ca (parfois la meme table)
                             ....... + une vingtaine de champs de la table
    FROM         dbo.Table1
    ORDER BY Date DESC
    Voici la requete dans ma procedure stockee qui est executee:
    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
    SELECT [ID]
          ,[Champ1ID]
          ,[Champ1Name]
          ,[Champ2Code]
          ,[Champ2Name]
          ,[Champ3ID]
          ,[Champ3Name]
          ...
          ,[ModifiedDate]
    FROM (	SELECT ROW_NUMBER() OVER (ORDER BY CreatedDate DESC) AS RowNum
    			  ,[Champ1ID]
                              ,[Champ1Name]
                              ,[Champ2Code]
                              ,[Champ2Name]
                              ,[Champ3ID]
                              ,[Champ3Name]
                              ...
                              ,[ModifiedDate]
    		FROM .[dbo].[viewTable1]  WHERE ...
    		) as viewTable1Derived
    WHERE RowNum > 1870 AND RowNum <= (1870 + 10)
    Qu'en pensez-vous ?
    Je ne sais pas si c'est tres clair... ?

    Merci
    A+

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Dans votre vue la requête de type scalaire est-elle vraiment justifiée ?
    Les jointures ne sont-elles pas satisfaisantes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT T1.ID, 
             T1.Champ1ID,
             dbo.FormatterTexte(LTRIM(RTRIM(T2.FirstName)) + ' ' + LTRIM(RTRIM(T2.LastName))) AS Name
             ...,
        FROM dbo.Table1 as T1
             LEFT OUTER JOIN T2.ID = T1.Champ1ID
    ORDER BY Date DESC

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    C'est ce que je me demandais oui...
    Ca devrait deja etre plus efficace qu'une sous requete ?

    Et si je joints plusieurs fois la meme table, je dois utiliser la meme table avec un alias different ou on peut reduire ca aussi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        FROM dbo.Table1 AS T1
                ,dbo.Table2 AS T2
                ,dbo.Table2 AS T2x
             LEFT OUTER JOIN T2.ID = T1.Champ1ID
             LEFT OUTER JOIN T2x.ID = T1.Champ1xID

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    J'ai modifie ma vue en supprimant les sous requetes et en mettant des LEF OUTER JOIN mais je suis surpris du resultat, c'est plus long..

    AVANT
    CPU: 590
    reads: 48055
    duration: 589

    APRES
    CPU: 1250
    reads: 42155
    duration: 1289

    Ca parait normal ou j'ai fais une erreur ?
    Est-ce que vous attendiez un meilleur score avec les LEFT OUTER JOIN ?

    Merci
    a+

  5. #5
    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
    Bonjour,

    Ce sera difficile à dire sans la requête, le plan de requête, et le DDL des tables ...

    @++

Discussions similaires

  1. ordre d'une requete en vue d'optimisation
    Par mussara dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/03/2007, 15h29
  2. [Optimisation] Requetes avec agregats et vue
    Par rad_hass dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/01/2006, 13h39
  3. [PL/SQL] Optimisation requete SQL
    Par CDRIK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2004, 09h52
  4. [SYBASE] optimisation requete UPDATE
    Par metheorn dans le forum Sybase
    Réponses: 8
    Dernier message: 24/05/2004, 17h01
  5. Optimisation requetes SQL
    Par joel90 dans le forum Administration
    Réponses: 18
    Dernier message: 15/05/2004, 21h45

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