DB2 MQT not rewriting role playing columns

database-designdb2

If in a MQT, if I have 2 referential constraints to the same table (role playing) , usage of one of the constraints doesnt allow the query to be optimized

Example

FACT_SALES

DIM_BILL_TO_ID –> DIM_ADDRESS

DIM_SHIP_TO_ID –> DIM_ADDRESS

SALES_AMOUNT

DIM_ADDRESS

DIM_ADDRESS_ID

COUNTRY_NAME

I create a MQT with the sql query definition as

MQT 1

SELECT COUNTRY_NAME,
SUM(SALES_AMOUNT)
FROM
FACT_SALES INNER JOIN DIM_ADDRESS ON FACT_SALES.DIM_BILL_TO_ID = DIM_ADDRESS.DIM_ADDRESS_ID
GROUP BY
COUNTRY_NAME

When a query is fired, automatically query rewrite happens and MQT is used

Lets say my definition was

MQT 2

SELECT a1.COUNTRY_NAME AS BILL_TO_NAME,
a2.COUNTRY_NAM AS SHIP_TO_NAME,
SUM(SALES_AMOUNT)
FROM
FACT_SALES INNER JOIN DIM_ADDRESS a1 ON FACT_SALES.DIM_BILL_TO_ID = a1.DIM_ADDRESS_ID
INNER JOIN DIM_ADDRESS a2 ON FACT_SALES.DIM_SHIP_TO_ID = a2.DIM_ADDRESS_ID

GROUP BY
a1.COUNTRY_NAME,a2.COUNTRY_NAME

and the query that was fired was

SELECT COUNTRY_NAME,
SUM(SALES_AMOUNT)
FROM
FACT_SALES INNER JOIN DIM_ADDRESS ON FACT_SALES.DIM_SHIP_TO_ID = DIM_ADDRESS.DIM_ADDRESS_ID
GROUP BY
COUNTRY_NAME

The query rewrite doesn't happen… but instead if I used BILL_TO_ID in the query, then query rewrite happens…

Is there any logic where the DB2 optimizer cant understand role playing columns?

Best Answer

You may wish to try creating indexes over the foreign keys.