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 :

Liste de cinq lignes avec saut de page => outils pour connaitre le nombre de pages ?


Sujet :

Développement SQL Server

  1. #21
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Salut,

    Merci pour ta réponse. Ca ne fonctionne pas car le SUM ne supporte pas les "bit" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Operand data type bit is invalid for sum operator.
    Et en mettant un COUNT a la place c'est toujours pareil...

    Vive Visual Studio.net !!!

  2. #22
    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
    il faut transtyper

    par exemple
    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
    41
    42
    43
    44
     
    WITH restrictionVol AS
    (
    SELECT Vols_avion.id ,
    	   Vols_avion.jour,	
    	   Vols_avion.DernierVolPage
    FROM vols_avion	
    )
    ,tmp AS (
    SELECT	A.id ,
    		A.jour,	
    		A.DernierVolPage,
    		CASE 
    				WHEN 	A.dernierVolPAge =  1 
    				OR 	ROW_NUMBER() OVER (
    							PARTITION BY COALESCE(SUM(CAST(B.DernierVolPage AS INT)), 0) 
    							ORDER BY A.jour 
    						) % 5 = 0
    					THEN 1
    		END
    		AS DernierVolPageAuto
    FROM restrictionVol 		A
    LEFT JOIN	restrictionVol  B
    	ON		B.jour < A.jour
    GROUP BY A.id ,
    		A.jour,	
    		A.DernierVolPage
    )
    SELECT 
    	A.id,
    	A.jour,
    	A.dernierVolPage,
    	COUNT(B.DernierVolPageAuto) +1 AS Page,
    	ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM	tmp A
    LEFT JOIN tmp B
    	ON			B.jour < A.jour
    	AND			B.DernierVolPageAuto = 1
    GROUP BY	
    		A.id,
    		A.jour,
    		A.dernierVolPage,
    		A.dernierVolPageAuto

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    GENIAL !!! Merci beaucoup à toi c'est super sympa !!!
    Vive Visual Studio.net !!!

  4. #24
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    il faut transtyper

    par exemple
    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
    41
    42
    43
    44
     
    WITH restrictionVol AS
    (
    SELECT Vols_avion.id ,
    	   Vols_avion.jour,	
    	   Vols_avion.DernierVolPage
    FROM vols_avion	
    )
    ,tmp AS (
    SELECT	A.id ,
    		A.jour,	
    		A.DernierVolPage,
    		CASE 
    				WHEN 	A.dernierVolPAge =  1 
    				OR 	ROW_NUMBER() OVER (
    							PARTITION BY COALESCE(SUM(CAST(B.DernierVolPage AS INT)), 0) 
    							ORDER BY A.jour 
    						) % 5 = 0
    					THEN 1
    		END
    		AS DernierVolPageAuto
    FROM restrictionVol 		A
    LEFT JOIN	restrictionVol  B
    	ON		B.jour < A.jour
    GROUP BY A.id ,
    		A.jour,	
    		A.DernierVolPage
    )
    SELECT 
    	A.id,
    	A.jour,
    	A.dernierVolPage,
    	COUNT(B.DernierVolPageAuto) +1 AS Page,
    	ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM	tmp A
    LEFT JOIN tmp B
    	ON			B.jour < A.jour
    	AND			B.DernierVolPageAuto = 1
    GROUP BY	
    		A.id,
    		A.jour,
    		A.dernierVolPage,
    		A.dernierVolPageAuto
    Salut !

    Désolé de ressortir le sujet, mais j'ai un petit soucis encore avec la requête : lorsque j'ai plusieurs lignes ayant la même date "jour", qui chevauche un saut de page, le saut de page ne se fait pas. Par exemple, si on rentre 25 lignes ayant pour jour "01/01/01", la page ne changera qu'après le 25ème jour, même si ce sont des pages de 10 lignes... je n'ai pas réussi à comprendre pourquoi. Tu aurais une idée ?

    Merci encore !
    Vive Visual Studio.net !!!

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

    Je pense que cela doit venir des
    Pourriez vous fournir un jeu d'essai sous forme de CREATE TABLE + INSERT pour ce cas ?

    Je n'ai pas relu tout le post, et je n'ai plus la logique de la requete en tête, mais qu'est ce que ça donne si vous remplacez
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    B.jour < A.jour
    OR 
    (B.jour = A.jour AND A.id < B.id)
    ?

  6. #26
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Salut !

    Merci encore pour ta réponse. Avant de retester la modif, j'ai un petit soucis avec ta requête. Elle fonctionne parfaitement sur un nombre raisonable de ligne (une centaine). Cependant, il semble qu'une utilisation sur des millers de lignes entraine rapidement des temps de réponse extrêmement longs (parfois 15 secondes). Est-ce que tu aurais une idée pour effectuer la même chose avec une requête plus rapide ? Ou bien optimiser la requête actuelle ?

    J'ai bien essayé des choses mais cela reste quand même compliqué et désolé de faire encore appel à toi, mais je manque d'expérience dans les requêtes "spéciales" comme celle-ci :-)

    Merci encore !
    Vive Visual Studio.net !!!

  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
    Pour pouvoir l'optimiser, il faudrait connaitre la requête finale (telle que vous l'avez adaptée), ainsi que la structure précise et complète de votre table et les index.

    Un jeu d'essai en plus serait parfait

  8. #28
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    J'ai créé une fonction avec cette requête :
    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
    41
    42
    43
    44
    45
    46
    47
    CREATE FUNCTION GetCarnet (@id_user INT, @NbVolParPage INT)
    RETURNS TABLE
    AS
    RETURN
    WITH restrictionVol AS
    (
    SELECT Vols_planeur.id ,
    	   Vols_planeur.jour,	
    	   Vols_planeur.DernierVolPage
    FROM Vols_planeur	
    )
    ,tmp AS (
    SELECT	A.id ,
    		A.jour,	
    		A.DernierVolPage,
    		CASE 
    				WHEN 	A.dernierVolPAge =  1 
    				OR 	ROW_NUMBER() OVER (
    							PARTITION BY COALESCE(SUM(B.DernierVolPage), 0) 
    							ORDER BY A.jour 
    						) % 5 = 0
    					THEN 1
    		END
    		AS DernierVolPageAuto
    FROM restrictionVol 		A
    LEFT JOIN	restrictionVol  B
    	ON		B.jour < A.jour
    GROUP BY A.id ,
    		A.jour,	
    		A.DernierVolPage
    )
    SELECT 
    	A.id,
    	A.jour,
    	A.dernierVolPage,
    	COUNT(B.DernierVolPageAuto) +1 AS Page,
    	ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM	tmp A
    LEFT JOIN tmp B
    	ON			B.jour < A.jour
    	AND			B.DernierVolPageAuto = 1
    GROUP BY	
    		A.id,
    		A.jour,
    		A.dernierVolPage,
    		A.dernierVolPageAuto
    Lorsque je l'appelle via SQL Server Management Studio, le temps de chargement est d'environ 1 à 2 secondes pour ce type de requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id FROM GetCarnet(@id_user,@NbVolparPage) WHERE page=@NPage ORDER BY Ligne
    Mais depuis mon code, et lorsque le site est beaucoup utilisé (en soirée), les temps de chargement deviennent très long. La procédure qui renvoit les lignes sous forme de string[] est la suivante :

    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
     public static string[] VOLS_Page(int NPage, string id_user, int NbVolparPage)
        {
            string sortie = "";
            SqlConnection SqlConnect = new SqlConnection(codes.connStr);
     
            string sql = "SELECT id FROM GetCarnet(@id_user,@NbVolparPage) WHERE page=@NPage ORDER BY Ligne";
     
            SqlCommand Commande = new SqlCommand(sql, SqlConnect);
            Commande.Parameters.Add(new SqlParameter("@id_user", id_user));
            Commande.Parameters.Add(new SqlParameter("@NbVolparPage", NbVolparPage));
            Commande.Parameters.Add(new SqlParameter("@NPage", NPage));
            SqlConnect.Open();
            try
            {
                SqlDataReader SqlReader = Commande.ExecuteReader();
                int i = 0;
     
                while (SqlReader.Read())
                {
                    sortie += SqlReader["id"].ToString() + " ";
                }
            }
            catch
            {
            }
            finally
            {
                SqlConnect.Close();
            }
            return sortie.Trim().Split();
        }
    Pour info, l'ancienne requête, qui ne prenait pas en compte les sauts de pages, était la suivante :

    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
        public static string[] VOLS_Page(int NPage, string id_user, int NbVolparPage)
        {
            string sortie = "";
            SqlConnection SqlConnect = new SqlConnection(codes.connStr);
     
            string sql = "SELECT * FROM " +
                    "(" +
                        "SELECT TOP " +
                        "(" + NbVolparPage + "-((" + NbVolparPage * NPage + ")-(SELECT COUNT(id) FROM (SELECT TOP (" + NbVolparPage * NPage + ") id,jour FROM Vols_Avion WHERE id_user=@id_user ORDER BY jour ASC, id ASC) as part))) id,jour " +
                        "FROM (SELECT id,jour FROM " +
                                "(SELECT TOP (" + NbVolparPage * NPage + ") id,jour FROM Vols_Avion WHERE id_user=@id_user ORDER BY jour ASC, id ASC) as part1 " +
                        ") as part3 ORDER BY jour DESC, id DESC " +
                    ") as part4 ORDER BY jour ASC, id ASC";
     
            SqlCommand Commande = new SqlCommand(sql, SqlConnect);
            Commande.Parameters.Add(new SqlParameter("@id_user", id_user));
            Commande.Parameters.Add(new SqlParameter("@NbVolparPage", NbVolparPage));
            Commande.Parameters.Add(new SqlParameter("@NPage", NPage));
            SqlConnect.Open();
            try
            {
                SqlDataReader SqlReader = Commande.ExecuteReader();
                int i = 0;
     
                while (SqlReader.Read())
                {
                    sortie += SqlReader["id"].ToString() + " ";
                }
            }
            catch
            {
            }
            finally
            {
                SqlConnect.Close();
            }
            return sortie.Trim().Split();
        }
    L'ancienne requête s'exécutait en environ 30ms. La nouvelle environ 1500ms, pour un nombre de lignes équivalent.
    Vive Visual Studio.net !!!

  9. #29
    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
    Un peu hors sujet mais si vous commencez à avoir beaucoup de ligne utilisez un StringBuilder en lieu et place de votre += pour effectuer la concaténation.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  10. #30
    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
    Dans votre fonction, vous ne filtrez pas sur @idUser... est-ce normal ?

  11. #31
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Pardon c'est une erreur il faut bien sur aussi filtrer sur Id_user
    Vive Visual Studio.net !!!

  12. #32
    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
    je disais donc :
    Citation Envoyé par aieeeuuuuu Voir le message
    Pour pouvoir l'optimiser, il faudrait connaitre la requête finale (telle que vous l'avez adaptée), ainsi que la structure précise et complète de votre table et les index.

    Un jeu d'essai en plus serait parfait

  13. #33
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Oui OK je vous envoie ca au plus vite. Qu'entendez-vous par jeu d'essai ? Je ne pourrai pas vous donner d'accès à ma base SQL Server mais déjà la table concernée est la suivante :
    http://sqlfiddle.com/#!6/822ed/25

    Merci je vous envoie plus de détails dans la soirée.
    Vive Visual Studio.net !!!

  14. #34
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Alors, j'ai créé une fonction table nommée GetCarnet. Voici le script de cette fonction dans SQL Server :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER FUNCTION [rablade].[GetCarnet] (@id_user INT, @NbVolParPage INT)
    RETURNS TABLE
    AS
    RETURN
    WITH restrictionVol AS
    (
    SELECT Vols_avion.id ,
               Vols_avion.jour,
               Vols_avion.DernierVolPage
    FROM vols_avion WHERE id_user=@id_user
    )
    ,tmp AS (
    SELECT  A.id ,
                    A.jour,
                    A.DernierVolPage,
                    CASE
                                    WHEN    A.dernierVolPAge =  1
                                    OR      ROW_NUMBER() OVER (
                                                            PARTITION BY COALESCE(SUM(CAST(B.DernierVolPage AS INT)), 0)
                                                            ORDER BY A.jour
                                                    ) % @NbVolParPage = 0
                                            THEN 1
                    END
                    AS DernierVolPageAuto
    FROM restrictionVol             A
    LEFT JOIN       restrictionVol  B
            ON              B.jour < A.jour
    GROUP BY A.id ,
                    A.jour,
                    A.DernierVolPage
    )
    SELECT
            A.id,
            A.jour,
            A.dernierVolPage,
            COUNT(B.DernierVolPageAuto) +1 AS Page,
            ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM    tmp A
    LEFT JOIN tmp B
            ON                      B.jour < A.jour
            AND                     B.DernierVolPageAuto = 1
    GROUP BY
                    A.id,
                    A.jour,
                    A.dernierVolPage,
                    A.dernierVolPageAuto
    Ensuite, tout simplement, j'ai créé deux fonctions pour comparer : la première utilise le GetCarnet (prise en compte des sauts de page) :

    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
    public static string[] VOLS_Page(int NPage, string id_user, int NbVolparPage)
        {
            string sortie = "";
            SqlConnection SqlConnect = new SqlConnection(codes.connStr);
     
            string sql = "SELECT id FROM GetCarnet(@id_user,@NbVolparPage) WHERE page=@NPage ORDER BY Ligne";
     
            SqlCommand Commande = new SqlCommand(sql, SqlConnect);
            Commande.Parameters.Add(new SqlParameter("@id_user", id_user));
            Commande.Parameters.Add(new SqlParameter("@NbVolparPage", NbVolparPage));
            Commande.Parameters.Add(new SqlParameter("@NPage", NPage));
            SqlConnect.Open();
            try
            {
                SqlDataReader SqlReader = Commande.ExecuteReader();
     
                while (SqlReader.Read())
                {
                    sortie += SqlReader["id"].ToString() + " ";
                }
            }
            catch
            {
            }
            finally
            {
                SqlConnect.Close();
            }
            return sortie.Trim().Split();
        }
    L'équivalent, sans prendre en compte les sauts de page est la suivante :

    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
    public static string[] VOLS_Page(int NPage, string id_user, int NbVolparPage)
        {
            string sortie = "";
            SqlConnection SqlConnect = new SqlConnection(codes.connStr);
     
            string sql = "SELECT * FROM " +
                    "(" +
                        "SELECT TOP " +
                        "(" + NbVolparPage + "-((" + NbVolparPage * NPage + ")-(SELECT COUNT(id) FROM (SELECT TOP (" + NbVolparPage * NPage + ") id,jour FROM Vols_Avion WHERE id_user=@id_user ORDER BY jour ASC, id ASC) as part))) id,jour " +
                        "FROM (SELECT id,jour FROM " +
                                "(SELECT TOP (" + NbVolparPage * NPage + ") id,jour FROM Vols_Avion WHERE id_user=@id_user ORDER BY jour ASC, id ASC) as part1 " +
                        ") as part3 ORDER BY jour DESC, id DESC " +
                    ") as part4 ORDER BY jour ASC, id ASC";
     
            SqlCommand Commande = new SqlCommand(sql, SqlConnect);
            Commande.Parameters.Add(new SqlParameter("@id_user", id_user));
            Commande.Parameters.Add(new SqlParameter("@NbVolparPage", NbVolparPage));
            Commande.Parameters.Add(new SqlParameter("@NPage", NPage));
            SqlConnect.Open();
            try
            {
                SqlDataReader SqlReader = Commande.ExecuteReader();
     
                while (SqlReader.Read())
                {
                    sortie += SqlReader["id"].ToString() + " ";
                }
            }
            catch
            {
            }
            finally
            {
                SqlConnect.Close();
            }
            return sortie.Trim().Split();
        }
    Ensuite, j'ai utilisé une page Lenteur.aspx qui appelle cette fonction, et renvoie le temps de réponse de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
             double startCounter= DateTime.Now.TimeOfDay.TotalMilliseconds;
     
            string[] Vols = VOLS_Page(15, "12", 14);
     
     
            double endCounter = DateTime.Now.TimeOfDay.TotalMilliseconds;
     
            double totalSeconds = Math.Ceiling(endCounter - startCounter);
     
            Response.Write("Temps de chargement (ms) : "+totalSeconds);
    La fonction sans saut de page renvoie une page de la pagination en environ 150ms. L'autre 1500ms.

    Le problème est que je dois appeler 3 fois la fonction sur un chargement de page. Ainsi, les temps s'ajoutent et cela peut devenir très gênant.

    Je t'ai mis le fichier Lenteur.aspx ici : http://dl.free.fr/getfile.pl?file=/wmeccYIu
    La structure de la base est telle que : http://sqlfiddle.com/#!6/822ed/25

    Merci encore.
    Vive Visual Studio.net !!!

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

    Il est normal que la requete avec les pages soit plsu longue... elle tout de même nettement plus complexe !
    Mais... pourquoi l'appeler vous trois fois ?

    vous pouvez peut être obtenir des temps de réponse en posant cet index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE INDEX ix_va on vols_avion(id_user, jour) include (DernierVolPage, id)
    et en faisant une requete recursive :
    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
     
    ;WITH tmp AS
    (
    SELECT		id ,
    			jour,
    			DernierVolPage,
    			ROW_NUMBER() OVER(ORDER BY jour, id) as Rn
    FROM vols_avion 
    WHERE id_user=@id_user
    )
    ,
    P AS (
    	SELECT 
    			id ,
    			jour,
    			DernierVolPage,
    			Rn,
    			1 as Page,
    			1 as Ligne
    	FROM tmp
    	WHERE Rn = 1
     
    	UNION ALL
     
    	SELECT 
    			B.id ,
    			B.jour,
    			B.DernierVolPage,
    			B.Rn,
    			CASE WHEN A.DernierVolPage = 1 OR A.Ligne = @NbVolParPage THEN A.Page + 1	ELSE A.Page			END,
    			CASE WHEN A.DernierVolPage = 1 OR A.Ligne = @NbVolParPage THEN 1			ELSE A.Ligne + 1	END
    	FROM P AS A
    	INNER JOIN tmp AS B
    		ON B.Rn = A.Rn + 1
    	)
    SELECT * 
    FROM P
    OPTION(MAXRECURSION 0)
    je pense qu'on pourrait même encore l'améliorer en mixant le principe des deux types de requêtes : faire une requête récursive, mais non pas ligne par ligne comme celle que je vous ai présentée, mais par bloque de lignes tant qu'il n'y a pas de saut de page manuel.

  16. #36
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Merci pour votre réponse. Malheureusement la version récursive est encore plus longue (plus d'une minute de temps de réponse).

    J'appelle la fonction 3 fois car sur une même page, je dois afficher les totaux des vols situés AVANT et APRES cette page + afficher les lignes de cette page.
    Vive Visual Studio.net !!!

  17. #37
    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
    au lieu de l'appeler trois fois renvoyez trois results sets via votre procédure stockée.
    Ensuite vous pouvez lire chaque result set avec le même datareader (SqlReader.NextResult).
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  18. #38
    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
    Avez vous bien posé l'index que je vous avais indiqué ?
    combien de lignes avez vous dans la table ?

    que donne cette requête (Une autre approche ):

    vous donne-t-elle bien les résultats voulu ?
    est-elle plus rapide ?

    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
    41
    42
    43
    44
    45
    46
    47
     
    ;WITH tmp AS
    (
    	SELECT		id ,
    				jour,
    				DernierVolPage,
    				ROW_NUMBER() OVER(ORDER BY jour, id) AS Rn
    	FROM vols_avion 
    	WHERE id_user=@id_user
    ),
    LastLigne AS(
    	SELECT 
    			Rn,
    			ROW_NUMBER() OVER(ORDER BY RN) As Ll
    	FROM	tmp
    	WHERE	DernierVolPAge = 1
    ),
    Blocs AS(
    	SELECT 
    			Debut.Rn AS RnDebut,
    			Fin.Rn AS RnFin,
    			ROW_NUMBER() OVER(ORDER BY Debut.Rn) as NoBloc
    	FROM	LastLigne Debut
    	INNER JOIN LastLigne Fin
    		ON	Fin.Ll = Debut.Ll + 1
    ), U AS(
    	SELECT 
    		tmp.id,
    			tmp.jour, 
    			(ROW_NUMBER() OVER(PARTITION BY NoBloc ORDER BY Rn) -1) / @NbVolParPage + 1 AS PageRelativeBloc,
    			(ROW_NUMBER() OVER(PARTITION BY NoBloc ORDER BY Rn) -1) % @NbVolParPage +1  AS LignePage,
    			tmp.RN,
    			NoBloc
    	FROM blocs
    	INNER JOIN tmp
    		ON tmp.Rn >blocs.RnDebut
    		AND tmp.Rn <= blocs.Rnfin
    )
    	SELECT 
    			id,
    			jour, 
    			PageRelativeBloc + COALESCE((SELECT MAX(PageRelativeBloc) FROM U B WHERE NoBloc = A.NoBloc - 1), 0) AS Page,
    			LignePage
    			--RN,
    			--NoBloc
    	FROM U A
    order by 3,4

  19. #39
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Bonsoir,

    Oui j'avais bien posé l'index, mais la version la plus rapide reste toujours la première version.

    Concernant cette nouvelle requête, elle ne renvoit aucune ligne (bien qu'aucune erreur), je ne comprend pas trop pourquoi... ?

    iberserk, auriez-vous un exemple de results sets ? J'ai fais quelques recherches mais je n'arrive pas à l'appliquer à mon cas

    Merci beaucoup pour votre aide !!!
    Vive Visual Studio.net !!!

  20. #40
    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
    Il faut chercher un peu Monsieur

    http://www.aspspider.com/resources/Resource822.aspx
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. [XL-2003] Connaitre le nombre de page d'un document word
    Par Krovax dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/07/2009, 22h21
  2. [WD-2003] Connaitre le nombre de page d'un document word
    Par Krovax dans le forum VBA Word
    Réponses: 4
    Dernier message: 07/07/2009, 21h23
  3. Connaitre le nombre de page
    Par toblerona dans le forum Rave
    Réponses: 6
    Dernier message: 19/06/2009, 20h01
  4. Réponses: 1
    Dernier message: 28/04/2009, 11h49
  5. Connaitre le nombre de page d'un fichier Word
    Par abbd dans le forum Services Web
    Réponses: 1
    Dernier message: 23/02/2009, 11h26

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