Se em um MQT, se eu tiver 2 restrições referenciais para a mesma tabela (interpretação de papéis), o uso de uma das restrições não permite que a consulta seja otimizada
Exemplo
FACT_SALES
DIM_BILL_TO_ID --> DIM_ADDRESS
DIM_SHIP_TO_ID --> DIM_ADDRESS
TOTAL DE VENDAS
DIM_ADDRESS
DIM_ADDRESS_ID
NOME DO PAÍS
Eu crio um MQT com a definição de consulta sql como
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
Quando uma consulta é disparada, ocorre a reescrita automática da consulta e o MQT é usado
Digamos que minha definição foi
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 = a2.DIM_ADDRESS_ID
GROUP BY a1.COUNTRY_NAME,a2.COUNTRY_NAME
e a consulta que foi disparada foi
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
A reescrita da consulta não acontece... mas, em vez disso, se eu usar BILL_TO_ID na consulta, a reescrita da consulta acontece...
Existe alguma lógica em que o otimizador do DB2 não consegue entender as colunas de interpretação de função?
Você pode tentar criar índices sobre as chaves estrangeiras.