Почему DB2 не будет использовать мою таблицу MQT? - PullRequest
2 голосов
/ 06 декабря 2009

Я создал поддерживаемый пользователем MQT (Materialized Query Table) в DB2 9.7 (еще не пакет исправлений 1). Это простая группировка таблицы основных фактов. Но мои запросы не переписываются, чтобы поразить его.

Вот что я пробовал:

  • Создано MQT с ВКЛЮЧЕННОЙ ОПТИМИЗАЦИЕЙ ЗАПРОСА и УСЛОВИЯМИ ПОЛЬЗОВАТЕЛЯ
  • Также включены ОБНОВЛЕНО ОТЛОЖЕНО И ДАННЫЕ изначально ОТЛОЖЕНЫ. (Может быть, я не должен был?)
  • Задать переменные реестра, указывающие DB2 на использование всех типов MQT для оптимизации
  • Ран "УСТАНОВИТЬ ЦЕЛОСТНОСТЬ для tableX ВСЕ НЕМЕДЛЕННО НЕПРОВЕРЕНО"
  • Ран-ранстаты
  • Сброшен кэш: ДИНАМИЧНЫЙ Кэш-память FLUSH
  • Гарантировал, что класс оптимизации запросов по умолчанию был как минимум на уровне 2 (это на 5)
  • Установить возраст обновления по умолчанию равным 0 (хотя я предполагаю, что это не имеет значения для пользовательских MQT)

Затем попытался определить, будет ли оптимизатор использовать MQT:

  • Пробовал различные простые запросы, которые я ожидаю использовать MQT - либо:
    • ВЫБРАТЬ СЧЕТ (*) ОТ факт_таблицы
    • или ВЫБЕРИТЕ групповое измерение, COUNT (*) FROM fact_table GROUP BY групповое измерение.
  • Объясните (используя db2expln) только ссылку на таблицу фактов, а не MQT
  • Результаты запроса показали, что значения соответствуют таблице фактов, а не таблице MQT
  • Продолжительность запроса соответствовала таблице фактов, а не таблице MQT.

Есть ли какие-либо предложения относительно более простого способа определить, использует ли запрос MQT, или что мне следует попробовать, чтобы заставить его использовать его?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2009

2 вещи:

1) На что установлен регистр CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION? По умолчанию используется параметр конфигурации базы данных DFT_MTTB_TYPES, а значением по умолчанию является 'SYSTEM', поэтому оптимизатор игнорирует ваш MQT.

2) Кроме того, ваше предположение о DFT_REFRESH_AGE и ПОДДЕРЖИВАЕМЫХ ПОЛЬЗОВАТЕЛЯМИ MQT неверно. DFT_REFRESH_AGE по-прежнему применяется - для поддерживаемого пользователем MQT регистр CURRENT REFRESH AGE должен быть установлен на ЛЮБОЙ, чтобы можно было рассматривать MQT с отложенным обновлением.

0 голосов
/ 08 июля 2015

Для устранения проблемы добавьте в запрос:

EXPLAIN PLAN FOR

и запустите его, затем получите диагностические сообщения:

SELECT EXPLAIN_TIME, DIAGNOSTIC_ID, MSG
    FROM TABLE(EXPLAIN_GET_MSGS(
      CAST(NULL AS VARCHAR(128)),
      CAST(NULL AS TIMESTAMP),
      CAST(NULL AS VARCHAR(128)),
      CAST(NULL AS VARCHAR(128)),
      CAST(NULL AS VARCHAR(64)),
      CAST(NULL AS CHAR(1)),
      CAST(NULL AS INTEGER),
      CAST(NULL AS INTEGER),
      'en_US'))
    AS REGISTRYINFO
    WHERE EXPLAIN_TIME >= (CURRENT TIMESTAMP - 1 HOUR)
    ORDER BY EXPLAIN_TIME desc
;

В моем случае это было:

EXPLAIN_TIME              DIAGNOSTIC_ID MSG                                                                                                                                                                                                                
------------------------- ------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2015-07-08 10:48:50.940231 1             EXP0053W  The materialized query table "DB2INST1"."XFACETATTR" was not considered for query matching because the isolation level of the query is higher than the isolation level of the materialized query table.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...