2017-10-18 14 views
0

J'ai une vue matérialisée récapitulative organisée par année (char), mois (char) et 3 autres dimensions, suivi de nombreuses mesures. Mes données s'étendent de 2013 à l'heure actuelle et augmentent continuellement. Étant donné que la table de faits sous-jacente est énorme (500 + M lignes incrémentées 100 + M chaque année), j'envisage de partitionner la table et le MV afin de ne rafraîchir que les 12 derniers mois dans le MV.Oracle Vues matérialisées: stratégie de partition

Après de nombreuses lectures, j'ai supposé partitionner la table de faits par intervalle (tous les mois) et partitionner le MV par mois et le partitionner par année.

Je sais que la stratégie de partition est cruciale pour les performances, donc je demande si quelqu'un a une meilleure solution ou celle que j'ai élaborée est optimale.

Merci!

Exemple de code de la partition MV:

CREATE MATERIALIZED VIEW my_mv 
    PARTITION BY LIST (month) SUBPARTITION BY LIST (year) 
     (PARTITION p01 VALUES ('01') 
      (SUBPARTITION p_0117 VALUES ('2017') 
      , SUBPARTITION p_0116 VALUES ('2016') 
      , SUBPARTITION p_0115 VALUES ('2015') 
      , SUBPARTITION p_0114 VALUES ('2014') 
      , SUBPARTITION p_0113 VALUES ('2013') 
     ) 
     , PARTITION p02 VALUES ('02') 
      (SUBPARTITION p_0217 VALUES ('2017') 
      , SUBPARTITION p_0216 VALUES ('2016') 
      , SUBPARTITION p_0215 VALUES ('2015') 
      , SUBPARTITION p_0214 VALUES ('2014') 
      , SUBPARTITION p_0213 VALUES ('2013') 
     ) 

     ... 

     , PARTITION p12 VALUES ('12') 
      (SUBPARTITION p_1217 VALUES ('2017') 
      , SUBPARTITION p_1216 VALUES ('2016') 
      , SUBPARTITION p_1215 VALUES ('2015') 
      , SUBPARTITION p_1214 VALUES ('2014') 
      , SUBPARTITION p_1213 VALUES ('2013') 
     ) 
     ) 
AS 
SELECT 
    ... 
FROM 
    ... 
; 

Répondre

1

Pourquoi ne pas faire simple cloison par mois? Cela n'a aucun sens de faire la partition par mois et sous-partition par année. La suppression de partitions plus anciennes ne serait pas possible, en général la maintenance serait assez difficile.

SELECT 
... 
TO_TIMESTAMP(year||month, 'YYYYMM') AS PARTITION_KEY, 
... 

puis pour vous mview:

PARTITION BY RANGE (PARTITION_KEY) INTERVAL (INTERVAL '1' MONTH) 

Cela vous permet aussi de toute la maintenance de la partition.

En ce qui concerne les performances, cela dépend fortement de vos requêtes principales. Il est assez facile d'avoir de moins bonnes performances sur une table partitionnée que sur une table non partitionnée. Si vos requêtes principales ne sélectionnent pas certaines plages de dates, la partition à la date est en contradiction (en termes de performances).

+0

Merci pour votre réponse! Avec la solution que vous suggérez est-il possible de rafraîchir seulement les 12 derniers mois du MV? Parce que je ne vois aucun nom de partition utilisant la technique de plage. Si c'est possible, pourriez-vous fournir un croquis du code pour le faire? Merci encore! –

+0

Lorsque vous utilisez 'method => 'P'' à [DBMS_MVIEW.REFRESH()] (https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_mview.htm#i997194), Oracle se rafraîchit Seules les partitions qui ont été modifiées depuis la dernière actualisation - qui devrait être la partition du mois dernier (en fonction de votre intervalle de partition). En général, vous pouvez adresser des partitions par nom, par ex. 'PARTITION P_201707' ou en valeur, par ex. 'PARTITION POUR (TIMESTAMP '2017-07-01 00:00:00')' –