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 :

Optimiser COUNT sur une table sans PK mais avec index unique


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut Optimiser COUNT sur une table sans PK mais avec index unique
    Hello,

    dans l'une de mes appli, j'effectue une boucle avec un count(*) sur chaque table d'un schéma pour récupérer le nombre de lignes.

    Ce count est de cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM T_TOTO where trunc(DATE_T) between to_date('01/08/2013','dd/mm/yyyy') and to_date('31/08/2013','dd/mm/yyyy')
    L'un de tables par exemple, contient 200.000.000 de lignes, de plus, il n'y a pas de clé primaire, mais un index unique sur quelques colonnes.

    Du coup, la requete ci-dessus, prend plus de 5mn à s'effectuer.

    Y aurait-il un moyen d'améliorer ça, sans toucher à la structure de la base/table ?
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Il y a un index sur date_t ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Oui, la plupart du temps il y en a un.
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    La plupart du temps ?

    Bref, sur les tables où il y a des indexes, est-ce qu'ils sont bien utilisés ?
    (A vérifier avec un explain plan ou trace)

    Sinon de manière générale il est préférable de ne pas appliquer de fonction sur la colonne indexée. Ici, tu pourrais réécrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT(*) FROM T_TOTO WHERE 
    DATE_T > to_date('01/08/2013','dd/mm/yyyy') 
    AND DATE_T  < to_date('31/08/2013','dd/mm/yyyy') + 1

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Oui c'est sûr que deja le TRUNC double facilement le temps d'exec, du coup je vais voir pour supprimer deja ça.

    Le fait de mettre un between plutôt qu'un > < ne doit pas influencer tant que ça le temps d'exec si?
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  6. #6
    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
    Citation Envoyé par erox44 Voir le message
    Le fait de mettre un between plutôt qu'un > < ne doit pas influencer tant que ça le temps d'exec si?
    Non, le between est réécrit par le parser d'Oracle en >= et <=.

    Pour être précis, dans la requête de pacmann il faut remplacer le > par un >=.

    Le trunc par contre empêche l'utilisation de l'index sur la colonne date_t.
    Regardez les plans d'exécution des deux requêtes et comparez-les.

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    +1 à Waldar sur la borne inf.

    Et donc, j'ai remplacé le between parce que la borne sup est inclusive dans le between, alors qu'en enlevant le trunc, il faut qu'elle soit exclusive pour que ce soit propre.

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Ok merc
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  9. #9
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par erox44 Voir le message
    Hello,

    dans l'une de mes appli, j'effectue une boucle avec un count(*) sur chaque table d'un schéma pour récupérer le nombre de lignes.
    ...
    Ca sert à quoi ? Plus précisément pourquoi voulez-vous récupérer le nombre des lignes de chaque table ? Pour quoi faire avec ?

  10. #10
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    En fait,
    le but de mon appli est de générer des script sql d'inserts pour exporter des données d'une base/table vers une autre.

    Sauf que si ma table contient un grand nombre de données ( c'est là que je fais le count) , je découpe mes scripts sql en scripts de 20.000 inserts max.


    Donc en gros dans mon appli, je boucle sur mes tables, pour chacune je fais le count, si > 20.000 , je crée des sous-fichiers, sinon un seul fichier.
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Et pourquoi ne pas passer par des fichiers plats et SQL*Loader ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  12. #12
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    ce sera une éventuelle upgrade mais pour l'instant je ne peux pas utiliser ça :/
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  13. #13
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    L’optimisation signifie éliminer le travail inutile. Dans votre cas le travail inutile consiste dans le comptage de lignes de tables. En plus de ne pas être correcte (sauf le cas d’être le seul utilisateur connecté à la base) votre algorithme est inefficace.

    Pour l'optimiser l’idée sera de ramener en même temps que les données l’information vous indiquant qu’un « sous-fichier » (?!) est nécessaire ou pas. Pour cela divers méthodes sont envisageables.

  14. #14
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Et pourquoi ne pas passer par des fichiers plats et SQL*Loader ?
    SQL*Loader n'est pas un outil d'export des données.

  15. #15
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Citation Envoyé par al1_24 Voir le message
    Et pourquoi ne pas passer par des fichiers plats et SQL*Loader ?
    SQL*Loader n'est pas un outil d'export des données.
    Ma proposition répondait à ceci :
    Citation Envoyé par erox44 Voir le message
    le but de mon appli est de générer des script sql d'inserts pour exporter des données d'une base/table vers une autre.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  16. #16
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Bonsoir,


    Vous pouvez utiliser rownum pour limiter le nombre de lectures aux 20001 premières lignes trouvées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT COUNT(*) FROM T_TOTO WHERE 
    DATE_T > to_date('01/08/2013','dd/mm/yyyy') 
    AND DATE_T  < to_date('31/08/2013','dd/mm/yyyy') + 1
    AND ROWNUM <= 20001
    Cdlt,
    OD

  17. #17
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Bon du coup, je pense que la seule opti possible dans mon cas sera d'éviter les fonctions trop gourmandes ( trunc ) .

    Olivier, je ne peux pas mettre de filtre rownum car il me faut la somme totale des lignes sur ma table ( avec eventuellement un filtre date) pour ensuite savoir combien de fichiers de 20.000 lignes je dois créer.




    Merci.
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  18. #18
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Tu peux aussi omettre les count, faire les extractions complètes, puis faire le split en script shell par exemple...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/11/2014, 19h48
  2. EJB entity sur une table sans clé
    Par omekiane dans le forum JPA
    Réponses: 0
    Dernier message: 03/12/2008, 08h23
  3. Réponses: 1
    Dernier message: 31/07/2008, 12h13
  4. COUNT sur une table differente.
    Par Havocks dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/07/2008, 15h27
  5. Réponses: 12
    Dernier message: 12/06/2006, 14h29

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