Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> HOW TO MAKE ORACLE USE MATERIALISED VIEW IN STAR SCHEMA
Hi there,
We created a data warehouse with a large fact table and dimension tables.
To increase performance we built a materialised view that aggregates order
data.
I expect Oracle to use the aggregate when all requested columns of the fact
table in the query are available in the aggregate. Unfortunately,
Oracle only seems to use the aggregate when no dimension columns are requested.
The base fact table is WTF_ORDERREGEL
This is the create statement:
CREATE MATERIALIZED VIEW WTA_ORDER_PERIODE_MAAND_TST
TABLESPACE SYSTEM
PARALLEL
BUILD IMMEDIATE
ENABLE QUERY REWRITE
AS
SELECT
AANNEEMPERIODE_KEY , AANNEEMMAAND_ISO_KEY , AANBIEDER_SERVICEVERANTW_KEY , AANBIEDER_VERKOOPVERANTW_KEY , AANBIEDER_CONTRACTVERANTW_KEY , AANBIEDLOCATIE_PROCES_KEY , AANPAKPERIODE_KEY , AANPAKMAAND_ISO_KEY , AANPAKLOCATIE_PROCES_KEY , BOEKPERIODE_KEY , FRANKEERWIJZE_KEY , KLANT_AANBIEDER_KEY , MARKTREGIME_KEY , NOC_CORRECTIECODE_KEY , ORDERSTATUS_KEY , ORDERSOORT_KEY , PRODUCTAFSPRAAK_KEY , PRODUCTAFSPR_BEOORDELING_KEY , PRODUCT_PRIJS_KEY , PRODUCT_AANGEBODEN_KEY , REGISTRATIEPERIODE_KEY , REGISTRATIEMAAND_ISO_KEY , BTW_PERCENTAGE , SUM(BDR_Z_COUL) AS BDR_Z_COUL , SUM(BEDRAG) AS BEDRAG , SUM(BTW_BEDRAG) AS BTW_BEDRAG , SUM(AANTAL_PRIJSINFO) AS AANTAL_PRIJSINFO, SUM(AANTAL_METING) AS AANTAL_METING, SUM(GEWICHT_KG_PRIJSINFO) AS GEWICHT_KG_PRIJSINFO, SUM(GEWICHT_KG_METING) AS GEWICHT_KG_METING, SUM(KIX_KORTING) AS KIX_KORTING, SUM(V48_KORTING) AS V48_KORTING, SUM(MACHINE_KORTING) AS MACHINE_KORTING, SUM(KWANTUM_KORTING) AS KWANTUM_KORTING, SUM(TIJDPLAATS_KORTING) AS TIJDPLAATS_KORTING , COUNT(*) AS CNT_STER , COUNT(BDR_Z_COUL) AS CNT_BDR_Z_COUL , COUNT(BEDRAG) AS CNT_BEDRAG , COUNT(BTW_BEDRAG) AS CNT_BTW_BEDRAG , COUNT(AANTAL_PRIJSINFO) AS CNT_AANTAL_PRIJSINFO, COUNT(AANTAL_METING) AS CNT_AANTAL_METING, COUNT(GEWICHT_KG_PRIJSINFO) AS CNT_GEWICHT_KG_PRIJSINFO, COUNT(GEWICHT_KG_METING) AS CNT_GEWICHT_KG_METING, COUNT(KIX_KORTING) AS CNT_KIX_KORTING, COUNT(V48_KORTING) AS CNT_V48_KORTING, COUNT(MACHINE_KORTING) AS CNT_MACHINE_KORTING, COUNT(KWANTUM_KORTING) AS CNT_KWANTUM_KORTING, COUNT(TIJDPLAATS_KORTING) AS CNT_TIJDPLAATS_KORTING FROM WTF_ORDERREGEL GROUP BY AANNEEMPERIODE_KEY , AANNEEMMAAND_ISO_KEY , AANBIEDER_SERVICEVERANTW_KEY , AANBIEDER_VERKOOPVERANTW_KEY , AANBIEDER_CONTRACTVERANTW_KEY , AANBIEDLOCATIE_PROCES_KEY , AANPAKPERIODE_KEY , AANPAKMAAND_ISO_KEY , AANPAKLOCATIE_PROCES_KEY , BOEKPERIODE_KEY , FRANKEERWIJZE_KEY , KLANT_AANBIEDER_KEY , MARKTREGIME_KEY , NOC_CORRECTIECODE_KEY , ORDERSTATUS_KEY , ORDERSOORT_KEY , PRODUCTAFSPRAAK_KEY , PRODUCTAFSPR_BEOORDELING_KEY , PRODUCT_PRIJS_KEY , PRODUCT_AANGEBODEN_KEY , REGISTRATIEPERIODE_KEY , REGISTRATIEMAAND_ISO_KEY , BTW_PERCENTAGE
Query:
SELECT
A_WTD_KLANT.RELATIENAAM, A_WTD_KLANT.KLANTNAAM, sum(A_WTF_ORDERREGEL.AANTAL_METING)
The plan shows that the BASE table is read, instead of the aggregate.
Execution Plan
The state of the view seems OK:
MVIEW_NAME REWRITE_ENAB REWRITE_CAP STALENESS COMPILE_ST ----------------------- ------------ ----------- --------- ---------- WTA_ORDER_PERIODE_MAAND_TST Y GENERAL FRESH VALID
Optimizer mode is ALL_ROWS
I would be very pleased to get some help.
Thanks in advance,
Michiel Brunt
Received on Mon Mar 18 2002 - 15:12:38 CST