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

ASP Discussion :

requete de select avec un count trop longue


Sujet :

ASP

  1. #1
    Membre confirmé Avatar de Phiss
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2005
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2005
    Messages : 676
    Points : 616
    Points
    616
    Par défaut requete de select avec un count trop longue
    Bonjour,

    Je reviens vers vous pour savoir comment je pourrais optimiser mon code afin que mes requêtes passent a tous les coup.

    Alors voilà.
    J'ai une base de données qui enregistre les stats de visites sur mon site.
    et je voudrais pour faire un récap sortir les visites par heure.

    j'ai donc une boucle qui passe les heures dans laquelle j'ai la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLQuery = "SELECT COUNT(Page) AS [NbPage] FROM stat WHERE jour between '"& daterecherche &" "& heure &":00:00' and '"& daterecherche &" "& heure &":59:59'"
    cette requête je l'exécute de la façon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set RS=objconnexion2.Execute(SQLQuery)
    et c'est sur cette ligne que j'ai à chaque fois un
    expiration du délai
    qui sort.

    Pour infos, pour une période calme j'ai minimum 30 secondes d'éxecution sur le sql server management.
    " L'absence diminue les médiocres passions et augmente les grandes, comme le vent éteint les bougies et allume le feu. "
    La Rochefoucauld

  2. #2
    Modérateur
    Avatar de roro06
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    1 480
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 480
    Points : 1 978
    Points
    1 978
    Par défaut
    Bonjour

    Il faut modifier la propriété server.scriptTimeout qui est de 90 secondes par defaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    server.scriptTimeout=300


    N'oubliez pas de consulter les FAQ ASP et les cours et tutoriels ASP

    " La vie c'est quelque chose de très fort et de très beau.... La vie appartient a tous les vivants. It's both a dream and a feeling. C'est être ce que nous ne sommes pas sans le rester. La vie c'est mourir aussi....Et mourir c'est vraiment strong...c'est rester en vie au delà de la mort...Tous ceux qui sont morts n'ignorent pas de le savoir."
    (J.C. VanDamme, humoriste et philosophe belge . A moins que ce ne soit l'inverse ...)

    Chuck Norris comprend JC Van Damme.

  3. #3
    Membre confirmé Avatar de Phiss
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2005
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2005
    Messages : 676
    Points : 616
    Points
    616
    Par défaut
    Salut,

    J'ai oublié de préciser ce point là.
    J'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <% Server.ScriptTimeout = 5000000 %>
    mais cela ne prends pas tout ce temps pour me sortir cette erreur.
    " L'absence diminue les médiocres passions et augmente les grandes, comme le vent éteint les bougies et allume le feu. "
    La Rochefoucauld

  4. #4
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Combien y a-t-il d'enregistrements dans ta table?
    Combien la requete renvoit-elle d'enregistrement?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  5. #5
    Membre confirmé Avatar de Phiss
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2005
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2005
    Messages : 676
    Points : 616
    Points
    616
    Par défaut
    Salut,

    Alors voilà j'ai une table assez importante puisque qu'a l'heure actuelle on est proche des 10 millions d'enregistrements et qu'elle grossit en moyenne de 140000 chaque jour.

    Quand à la requête, elle renvoie qu'une ligne puisque c'est un count.
    si tu veux savoir le nombre ressortit au maximum, je tourne autour des 15000.

    Voilà.
    " L'absence diminue les médiocres passions et augmente les grandes, comme le vent éteint les bougies et allume le feu. "
    La Rochefoucauld

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    522
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 522
    Points : 522
    Points
    522
    Par défaut
    Salut,

    Tu peux aller voir là (c'est moi qui avais répondu )
    http://www.developpez.net/forums/sho...91#post2689191

  7. #7
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Tu peux aussi créer des indexes dans la table.
    Sur SQL Server 2005 il y a un optiomiseur de requetes.

    Je joins un fichier htm qui rend compte du temps mis pour executer une requete en fonction du type de curseur. Voici le code:
    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
    on error resume next
    response.Write("<table border = '1'>" + Chr(13) + Chr(10))
    response.Write("<tr><td colspan='3'>Demandé</td><td colspan=3>Obtenu</td></tr>" + Chr(13) + Chr(10))
    response.Write("<td>Location</td><td>Type</td><td>Lock</td><td>Location</td><td>Type</td><td>Lock</td><td>Count</td><td>Time</td>" + Chr(13) + Chr(10))
    dim t
    for i = 1  to 3
    		for j = -1 to 3
    			for k = -1 to 4
    				Set rs = server.CreateObject("ADODB.Recordset")
    					rs.CursorLocation = i
    					rs.CursorType = j
    					rs.locktype = k
    					response.Write("<tr>" + Chr(13) + Chr(10))
    					response.Write("<td>" & i & "</td><td>" & j & "</td><td>" & k & "</td>" + Chr(13) + Chr(10))
    					t = cdbl(now())
    					rs.open "SELECT * FROM EACFinal", strProvider
    						response.Write("<td>" & rs.CursorLocation & "</td><td>" & rs.CursorType & "</td><td>" & rs.locktype & "</td>" + Chr(13) + Chr(10))
    						IF err.number <> 0 Then
    							response.Write("<td>" & rs.recordcount & "</td>" + Chr(13) + Chr(10))
    						else
    							response.Write("<td>XXX</td>" + Chr(13) + Chr(10))
    						end if
    					rs.close
    					t = cdbl(now()) - t
    					response.Write("<td>" & round(t*86400,6) & " s</td>")
    					response.Write("</tr>" + Chr(13) + Chr(10))
    				Set rs = nothing
    			next
    		Next		
    next
    response.Write("</table><br>" + Chr(13) + Chr(10))
    La requete n'est pas une requete de comptage, mais donne une bonne idée des performances. Perso, je dirais que le meilleur curseur est le 3,3,1 (adUseClient, adOpenStatic, adLockReadOnly), ou alors un objet command.
    Essayes aussi de faire un qui semble optimisé pour ça.
    A+
    Fichiers attachés Fichiers attachés
    "Winter is coming" (ma nouvelle page d'accueil)

  8. #8
    Membre confirmé Avatar de Phiss
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2005
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2005
    Messages : 676
    Points : 616
    Points
    616
    Par défaut
    Salut à vous deux.

    Tekpaf, c'est sur que cela passe. Masi je vais voir avec ce que Immobilis m'a passé pour voir si on peut raccourcir le temps.

    Immobilis, ce que tu me fait passer m'intéresse mais j'ai du mal a comprendre comment on paramètre un curseur.
    Tu peux m'en dire plus?

    " L'absence diminue les médiocres passions et augmente les grandes, comme le vent éteint les bougies et allume le feu. "
    La Rochefoucauld

  9. #9
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Un recordset a plusieurs propriétés (tu t'en doutes) parmis lequelles:
    1. CursorLocation
    2. CursorType
    3. locktype

    En fonction des valeurs que tu attribus le serveur créé un curseur qui va parcourir les données. Le curseur ne correspond pas forcement à celui qui est demandé. C'est ce qui est affiché dans le tableau. Certains curseurs sont plus rapides que d'autres. Il faut donc choisir en fonction des besoins. Comme dans la plupart des cas on les utilise pour lire des données, le curseur 3,3,1 suffit et est un des plus rapides.

    Après, il faut penser à indexer les tables.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

Discussions similaires

  1. Problème requete SQL SELECT avec access
    Par cactus666 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 12/12/2007, 12h46
  2. select avec plusieurs count as
    Par esojrehcir dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/10/2007, 17h05
  3. Oracle 8 : INSERT SELECT avec NOT IN trop long
    Par davy.g dans le forum Oracle
    Réponses: 6
    Dernier message: 03/07/2007, 11h33
  4. Réponses: 2
    Dernier message: 15/01/2007, 11h31
  5. [HyperFile] requete de selection avec condition de comptage
    Par pierre.zelb dans le forum HyperFileSQL
    Réponses: 1
    Dernier message: 16/02/2006, 10h20

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