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

SQL Oracle Discussion :

Optimisation GROUP BY et IN avec beaucoup de valeurs


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Par défaut Optimisation GROUP BY et IN avec beaucoup de valeurs
    Bonjour.
    Dans le cadre d'une application, je dois réaliser une requête de type group by sur une table assez volumineuse.

    La requete ressemble donc a cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT COUNT (*), B
    FROM TABLE
    WHERE T_DATE BETWEEN ? AND ?
    AND T_SITE IN (?,?,?,.......)
    GROUP BY B
    Je cherche donc le nombre de lignes ou le site est dans les valeurs de la liste, et ce pour chacun des sites spécifiées, le tout dans les dates indiqués (c'est une table de traces)

    EDIT : il peut arriver que dans T_SITE IN (?,?,?...) , il y aie 400 valeurs différentes !

    La table est assez grande (15 000 000 lignes). La requête prend a peu prés deux minutes, et ce n'est pas acceptable pour le client.

    Je travaille en Oracle 9i, et je cherche un moyen de l'optimiser (index, réécriture de la requete...) auriez vous des idées ?

    Merci d'avance de votre aide.

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Quand tu as 400 valeurs dans le IN combien de lignes trouves-tu au total ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Par défaut
    Le nombre de résultats est très variable, selon l'étendue de date et selon les sites :

    Il y a approximativement 20000 sites différents dans la base.
    pour un site lourd, sur une journée il doit y avoir dans les 25 lignes.
    pour un site léger, sur une journée il doit y avoir dans les 2 ou 3 lignes.

    Par contre c'est envisageable de limiter le nombre de résultats. Par exemple n'avoir que les X plus grandes valeurs de group by. J'avais oublié de le préciser.

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par le_gnou Voir le message
    auriez vous des idées ?
    Une idée serait d'analyser le plan d'exécution! Ou sinon de remplacer le IN(1,2,3,4...) par IN(SELECT*FROM"temptable"). En effet si tu as 400 valeurs aujourd'hui, tu en auras peut-être 2000 demain ou dans dix ans (et la limite est de 1000).


  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Par défaut
    J'ai regardé du cote du plan d'exécution, il y a du unique scan et du range scan (ce qui ne devrait pas couter trop cher, si ?)

    pour ce qui est de la requête, les sites sont passés en paramètre dans une appli J2EE. j'avais déja prévu le coup du IN en remplaçant par (SITE = ? OR SITE = ? OR....) faute de mieux, et vu que le plan d'éxec était le même qu'avec un IN, je m'en suis pas plus occupé que ca.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je ne connais pas la répartition de vos données, mais vous pouvez envisager une partition sur T_DATE (mois / année en fonction de la volumétrie), avec des index locaux sur T_SITE.

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par le_gnou Voir le message
    J'ai regardé du cote du plan d'exécution, il y a du unique scan et du range scan (ce qui ne devrait pas couter trop cher, si ?)
    Serait-ce trop demander que de nous le partager ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Par défaut
    Je ne sais pas si le code va ressortir proprement !
    Voici le plan d'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT STATEMENT	CHOOSE								
    SORT(GROUP BY)									
    COUNT(STOPKEY)									ROWNUM<=2000
    TABLE ACCESS(BY INDEX ROWID) M1USER.JOURNAL									"JOURNAL"."JOUR_ID_SITE"=19332 OR "JOURNAL"."JOUR_ID_SITE"=19332 OR "JOURNAL"."JOUR_ID_SITE"=19332 OR "JOURNAL"."JOUR_ID_SITE"=19332
    INDEX(RANGE SCAN) M1USER.DATETRAITEMENT								"JOURNAL"."JOUR_DATE_TRAITEMENT">TO_DATE(' 2008-10-17 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "JOURNAL"."JOUR_DATE_TRAITEMENT"<TO_DATE(' 2008-10-24 00:00:00', 'syyyy-mm-dd hh24:mi:ss')
    Edit : j'ai mis 4 sites seulement pour ne pas polluer le plan, le résultat est le meme avec 400 sites

Discussions similaires

  1. Optimisation vue avec beaucoup de jointures
    Par oneagaindoguys dans le forum Requêtes
    Réponses: 9
    Dernier message: 07/08/2012, 11h02
  2. Comment eviter de faire un Select Case avec beaucoup de valeur
    Par jam92400 dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 05/11/2010, 15h19
  3. Tableau avec beaucoup de colonnes
    Par night59 dans le forum BIRT
    Réponses: 5
    Dernier message: 01/07/2007, 11h48
  4. Remplir un StringGrid avec beaucoup de données
    Par Gaadek dans le forum Delphi
    Réponses: 9
    Dernier message: 08/06/2006, 20h47

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