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 :

résultats différents lors de la création de deux vues matérialisées similaires


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut résultats différents lors de la création de deux vues matérialisées similaires
    Bonjour,

    J'essaye de créer des vues matérialisées dans ma base de données, elles sont toutes relativement similaires, mais seulement deux sur les 4 ont été créées.

    J'ai tout d'abord créé des tables de log sur les tables requises comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE MATERIALIZED VIEW LOG ON ApplicationStats WITH rowid, SEQUENCE(Status, DateStatus, Counted, ApplicationId) INCLUDING new values;
    CREATE MATERIALIZED VIEW LOG ON SlaList WITH rowid, SEQUENCE(Days, StartDate, EndDate, Id) INCLUDING new values;
    CREATE MATERIALIZED VIEW LOG ON Applications WITH rowid, SEQUENCE(id, slaId) INCLUDING new values;
    Ensuite voici les deux vm qui sont passées avec un petit commentaire
    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
    --vue pour avoir le total par jour des status ok et ko de chaque application
    CREATE MATERIALIZED VIEW ApplicationStatsDay
    REFRESH fast START WITH TRUNC(SYSDATE + 1) + 1 / 24 NEXT TRUNC(SYSDATE + 1) + 1
    AS
    	SELECT Ap.id AS Appid, trunc(aps.datestatus) AS Day, TO_CHAR(TRUNC(aps.datestatus), 'YYYYIW') AS Week, TO_CHAR(TRUNC(aps.datestatus), 'YYYYMM') AS Month, COUNT(aps.status) AS nb_applicationstats, aps.status AS status
    	FROM applications Ap, applicationstats aps, SlaList
    	WHERE Ap.id = aps.applicationid 
    	AND Slalist.id = Ap.slaid
    	AND aps.counted = 1
    	AND TO_NUMBER(TO_CHAR(aps.datestatus,'HH24'))*60 + TO_NUMBER(TO_CHAR(aps.datestatus,'MI'))
    	BETWEEN TO_NUMBER(TO_CHAR(Slalist.startdate,'HH24'))*60 + TO_NUMBER(TO_CHAR(Slalist.startdate,'MI'))
    	AND TO_NUMBER(TO_CHAR(Slalist.endDate,'HH24'))*60 + TO_NUMBER(TO_CHAR(Slalist.endDate,'MI'))
    	AND INSTR(Slalist.Days, TO_CHAR(aps.datestatus,'DY')) <> 0
    	GROUP BY ap.id, TRUNC(aps.datestatus), aps.status
    	ORDER BY appid, month, week, day
    /
     
     
    --vue pour avoir le total par mois des status ok et ko de chaque application
    CREATE MATERIALIZED VIEW ApplicationStatsMonth
    REFRESH fast START WITH TRUNC(SYSDATE + 1) + 1 / 24 NEXT TRUNC(SYSDATE + 1) + 1
    AS
    	SELECT Ap.id AS Appid, TO_CHAR(TRUNC(aps.datestatus), 'MONTH') AS Month, TO_CHAR(TRUNC(aps.datestatus), 'MM') AS MonthNumber, TO_CHAR(TRUNC(aps.datestatus), 'YYYY') AS Year, COUNT(aps.status) as nb_applicationstats, aps.status AS status
    	FROM applications Ap, applicationstats aps, SlaList
    	WHERE Ap.id = aps.applicationid 
    	AND Slalist.id = Ap.slaid
    	AND aps.counted = 1
    	AND TO_NUMBER(TO_CHAR(aps.datestatus,'HH24'))*60 + TO_NUMBER(TO_CHAR(aps.datestatus,'MI'))
    	BETWEEN TO_NUMBER(TO_CHAR(Slalist.startdate,'HH24'))*60 + TO_NUMBER(TO_CHAR(Slalist.startdate,'MI'))
    	AND TO_NUMBER(TO_CHAR(Slalist.endDate,'HH24'))*60 + TO_NUMBER(TO_CHAR(Slalist.endDate,'MI'))
    	AND INSTR(Slalist.Days, TO_CHAR(aps.datestatus,'DY')) <> 0
    	GROUP BY ap.id, TO_CHAR(TRUNC(datestatus), 'MONTH'), TO_CHAR(TRUNC(datestatus), 'MM'), TO_CHAR(TRUNC(datestatus), 'YYYY'), aps.status
    	ORDER BY appid, year, monthNumber
    /
    Et le code des deux qui ne sont pas passées avec l'erreur sous chacune d'elle
    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
    --vue pour avoir le total par semaine des status ok et ko de chaque application
    CREATE MATERIALIZED VIEW ApplicationStatsWeek
    REFRESH fast START WITH TRUNC(SYSDATE + 1) + 1 / 24 NEXT TRUNC(SYSDATE + 1) + 1
    AS
    	SELECT Ap.id AS Appid, 'Week '||TO_CHAR(TRUNC(aps.datestatus), 'IW') AS Week, TO_CHAR(TRUNC(aps.datestatus), 'YYYYQ') AS Quarter, COUNT(aps.status) AS nb_applicationstats,aps.status AS status
    	FROM applications Ap, applicationstats aps, SlaList
    	WHERE Ap.id = aps.applicationid
    	AND Slalist.id = Ap.slaid
    	AND aps.counted = 1
    	AND TO_NUMBER(TO_CHAR(aps.datestatus,'HH24'))*60 + TO_NUMBER(TO_CHAR(aps.datestatus,'MI'))
    	BETWEEN TO_NUMBER(TO_CHAR(Slalist.startdate,'HH24'))*60 + TO_NUMBER(TO_CHAR(Slalist.startdate,'MI'))
    	AND TO_NUMBER(TO_CHAR(Slalist.endDate,'HH24'))*60 + TO_NUMBER(TO_CHAR(Slalist.endDate,'MI'))
    	AND INSTR(Slalist.Days, TO_CHAR(aps.datestatus,'DY')) <> 0
    	GROUP BY ap.id, TO_CHAR(TRUNC(aps.datestatus), 'IW'), TO_CHAR(TRUNC(aps.datestatus), 'YYYYQ'), aps.status
    	ORDER BY appid, quarter, week
    /
     
    AND INSTR(Slalist.Days, TO_CHAR(aps.datestatus,'DY')) <> 0
                                                      *
    ERROR at line 12:
    ORA-12015: cannot create a fast refresh materialized veiw from a complex query
     
     
     
    --vue de la table ApplicationStats pour ne voir que les tests étant dans la période SLA
    CREATE MATERIALIZED VIEW ApplicationStatsSla
    REFRESH fast START WITH TRUNC(SYSDATE + 1) + 1 / 24 NEXT TRUNC(SYSDATE + 1) + 1
    AS
    	SELECT aps.id, aps.status, aps.datestatus, aps.counted, aps.maintComment, aps.applicationId 
    	FROM ApplicationStats aps, SlaList, applications a
    	WHERE a.id = aps.applicationId
    	AND a.slaId = SlaList.id
    	AND TO_NUMBER(TO_CHAR(aps.datestatus,'HH24'))*60 + TO_NUMBER(TO_CHAR(aps.datestatus,'MI'))
    	BETWEEN TO_NUMBER(TO_CHAR(SlaList.StartDate,'HH24'))*60 + TO_NUMBER(TO_CHAR(SlaList.StartDate,'MI'))
    	AND TO_NUMBER(TO_CHAR(SlaList.EndDate,'HH24'))*60 + TO_NUMBER(TO_CHAR(SlaList.EndDate,'MI'))
    	AND	INSTR(SlaList.Days, TO_CHAR(aps.datestatus,'DY')) <> 0
    /
     
    AND	INSTR(SlaList.Days, TO_CHAR(aps.datestatus,'DY')) <> 0
                                                                 *
    ERROR at line 11:
    ORA-12052: cannot fast refresh materialized view PORTAL.APPLICATIONSTATSSLA
    Je ne comprends aucune des deux erreurs car la première est quasiment identique que la vm ApplicationStatsMonth (deuxième qui est passée) et la deuxième échouée est une copie conforme de la table d'origine mais avec des lignes en moins en gros...

    Voyez vous quelque chose qui cloche ?
    Pour info je tourne sous 11g en dev, et le serveur de prod sur lequel les vues seront retranscrites tourne sous 10g.

    Merci d'avance pour votre aide car je ne vois pas du tout ce qui cloche vu la similitude qu'il y a entre les requêtes...

  2. #2
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    J'ai corrigé l'erreur 12015. Il s'agissait du GROUP BY l'une des options ne correspondait pas au select :
    GROUP BY TO_CHAR(TRUNC(aps.datestatus), 'IW')
    SELECT 'Week '||TO_CHAR(TRUNC(aps.datestatus), 'IW') AS Week
    Par contre j'ai toujours l'erreur 12052 sur la vm 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
     
    --vue de la table ApplicationStats pour ne voir que les tests étant dans la période SLA
    CREATE MATERIALIZED VIEW ApplicationStatsSla
    REFRESH fast START WITH TRUNC(SYSDATE + 1) + 1 / 24 NEXT TRUNC(SYSDATE + 1) + 1
    AS
    	SELECT aps.id, aps.STATUS, aps.datestatus, aps.counted, aps.maintComment, aps.applicationId 
    	FROM ApplicationStats aps, SlaList, applications a
    	WHERE a.id = aps.applicationId
    	AND a.slaId = SlaList.id
    	AND TO_NUMBER(TO_CHAR(aps.datestatus,'HH24'))*60 + TO_NUMBER(TO_CHAR(aps.datestatus,'MI'))
    	BETWEEN TO_NUMBER(TO_CHAR(SlaList.StartDate,'HH24'))*60 + TO_NUMBER(TO_CHAR(SlaList.StartDate,'MI'))
    	AND TO_NUMBER(TO_CHAR(SlaList.EndDate,'HH24'))*60 + TO_NUMBER(TO_CHAR(SlaList.EndDate,'MI'))
    	AND	INSTR(SlaList.Days, TO_CHAR(aps.datestatus,'DY')) <> 0
    /
     
    AND	INSTR(SlaList.Days, TO_CHAR(aps.datestatus,'DY')) <> 0
                                                                 *
    ERROR at line 11:
    ORA-12052: cannot fast refresh materialized VIEW PORTAL.APPLICATIONSTATSSLA
    Mais je ne trouve pas d'où ça vient...

    Help please. Merci d'avance

  3. #3
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Je ne comprends pas trop ...

    J'ai modifié mes logs comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE MATERIALIZED VIEW LOG ON ApplicationStats WITH rowid, SEQUENCE(Status, DateStatus, Counted, maintcomment, ApplicationId), PRIMARY KEY INCLUDING new values;
    CREATE MATERIALIZED VIEW LOG ON SlaList WITH rowid, SEQUENCE(Days, StartDate, EndDate), PRIMARY KEY INCLUDING new values;
    CREATE MATERIALIZED VIEW LOG ON Applications WITH rowid, SEQUENCE(slaId), PRIMARY KEY INCLUDING new values;
    Puis j'ai essayé de créer ma vm comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE MATERIALIZED VIEW ApplicationStatsSla
    REFRESH fast START WITH TRUNC(SYSDATE + 1) + 1 / 24 NEXT TRUNC(SYSDATE + 1) + 1
    AS
    	SELECT aps.id, aps.status, aps.datestatus, aps.counted, aps.maintComment, aps.applicationId
    	FROM ApplicationStats aps
    /
    Ce code-ci marche.

    Mais dès que je mets les autres tables dont j'aurai besoin dans la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE MATERIALIZED VIEW ApplicationStatsSla
    REFRESH fast START WITH TRUNC(SYSDATE + 1) + 1 / 24 NEXT TRUNC(SYSDATE + 1) + 1
    AS
    	SELECT aps.id, aps.status, aps.datestatus, aps.counted, aps.maintComment, aps.applicationId
    	FROM ApplicationStats aps, applications ap, SlaList
     
    ERROR at line 5:
    ORA-12052: cannot fast refresh materialized view PORTAL.APPLICATIONSTATSSLA
    En gros, il me jette dès que j'essaye d'avoir d'autres tables ...
    Et je ne trouve rien sur comment corriger cette erreur ...

    Help me please

    Merci d'avance

  4. #4
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    pour ceux que ça intéressera j'ai résolu le problème en ajoutant dans la sélection les rowid de chaque materialized view log (soit 3 champs en plus dans la vue, il suffit de ne pas les sélectionner par la suite)

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/04/2010, 19h15
  2. Réponses: 3
    Dernier message: 13/07/2009, 03h04
  3. Réponses: 2
    Dernier message: 06/04/2008, 11h33
  4. Réponses: 1
    Dernier message: 16/07/2007, 09h54

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