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 :

Faire des agrégats avec des tables de granulités différentes


Sujet :

SQL Oracle

  1. #1
    Membre chevronné
    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 013
    Points : 1 763
    Points
    1 763
    Par défaut Faire des agrégats avec des tables de granulités différentes
    Hello la compagnie,

    Comment fais t-on pour agréger plusieurs valeurs de plusieurs tables ayant des granularité différentes sans passer par des sous requêtes? Est il possible de passer par les fonctions analytique over ?

    Dans mon cas, je souhaiterais par table :
    - connaitre la taille moyenne utile d'une partition et de la table
    - connaitre la taille des segments
    - connaitre la taille des tables spaces


    Pour récupérer la taille moyenne de mes partitions, je vais utiliser la table user_tab_partitions dans laquelle je vais exploiter les champs avg_len et num_rows qui me permettront de calculer la taille utile par partition. Comme je veux avoir les tailles par table, je vais faire un regroupement par table table_name

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select table_name, avg(avg_len*num_rows) as TAILLE_PARTITION, 
    sum(avg_len*num_rows) as TAILLE_TABLE_UTILISE
    from user_tab_partitions
    group by table_name

    J'aimerais ensuite pouvoir mettre en opposition la taille utile avec la taille des tables spaces relatives aux tables. Je peux obtenir via la table dba_datafile l'information.


    Si j'écris cette requête avec une simple jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select user_tab_partitions.table_name, avg(user_tab_partitions.avg_len*user_tab_partitions.num_rows) as TAILLE_PARTITION, 
    sum(avg_len*num_rows) as TAILLE_TABLE_UTILISE, 
    sum(dba_datafiles.bytes) as TAILLE_TABLESPACE
    from user_tab_partitions
        inner join dba_datafiles on user_tab_partitions.tablespace_name=dba_datafiles.tablespace_name
    group by user_tab_partitions.table_name
    le champs dba_datafiles.bytes va être comptabilisé plusieurs fois dans l'agrégat en doublons. En effet, user_tab_partitions retourne l'ensemble des partitions par table (table_name) avec le tablespace associé. Or plusieurs partitions, j'ai le même tablespace, user_table_partition va me renvoyer en doublon. On se retrouve donc avec la table dba_datafiles avec pas mal de ligne en doublon. Le résultat n'est donc plus juste.

    Pour ne plus avoir les lignes en doublons, je ne fais plus la jointure dba_datafiles. Je fais une sous jointure dans ma clause select avec ceci :

    sum(dba_datafiles.bytes)
    from dba_datafiles
    where dba_datafiles.tablespace_name in (
    select distinct user_tab_partitions.tablespace_name
    from user_tab_partitions
    where user_tab_partitions.table_name=<table_name de ma requête principal>)

    Cependant je ne trouve cela vraiment pas propre du tout. Ne serait il pas possible d'éviter les sous requêtes et utiliser les fonctions de fenêtrage OVER ?


    PS : j'écris de tête de chez moi les noms des tables. Je ne suis pas exactement du nom des champs et tables.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je ne suis pas sûr de bien comprendre votre sous reqête scalaire, je pense que vous avez mis une étape en trop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select p.table_name
         , avg(p.avg_len*p.num_rows) as TAILLE_PARTITION
         , sum(p.avg_len*p.num_rows) as TAILLE_TABLE_UTILISE
         , (select sum(df.bytes) from dba_data_files df where df.tablespace_name = p.tablespace_name) as TAILLE_TABLESPACE
      from user_tab_partitions p
     group by p.table_name
    Ou sinon vous faites l'agrégation avant puis la jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      with df as (
    select tablespace_name, sum(bytes) 
      from dba_data_files
     group by tablespace_name
    )
    select p.table_name
         , avg(p.avg_len*p.num_rows) as TAILLE_PARTITION
         , sum(p.avg_len*p.num_rows) as TAILLE_TABLE_UTILISE
         , sum(df.bytes) as TAILLE_TABLESPACE
      from user_tab_partitions p
      join df on df.tablespace_name = p.tablespace_name
     group by p.table_name

Discussions similaires

  1. [XL-2010] Comment compter des cellules avec des couleurs avec une condition
    Par Aimey dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/11/2015, 03h23
  2. Parser un JSON avec des variables avec des "-" et des ":"
    Par Quentin33 dans le forum Windows Phone
    Réponses: 2
    Dernier message: 22/05/2011, 01h04
  3. Réponses: 1
    Dernier message: 27/01/2010, 17h04
  4. Réponses: 4
    Dernier message: 02/04/2008, 17h51
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45

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