2009-12-05 2 views
2

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

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

  • Создан MQT с ВКЛЮЧИТЬ Оптимизация запросов и поддерживается характеристиками USER
  • Также ОБНОВЛ DEFERRED & DATA INITIALLY Отложенный. (Может быть, я не должен был?)
  • Установите переменные реестра, рассказывающие DB2 использовать все типы таблицы MQT для оптимизации
  • Ран "SET INTEGRITY для tableX ALL НЕМЕДЛЕННОЙ непроверенных"
  • Ран RUNSTATS
  • Окрыленный кэш: FLUSH PACKAGE CACHE DYNAMIC
  • Обеспечено, что класс оптимизации запроса по умолчанию, по крайней мере на уровне 2 (это на 5)
  • Установить обновления по умолчанию возраст до 0 (Тхо Я полагаю, это не имеет значения с заданными пользователем таблицы MQT)

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

  • Пробовал различные простые запросы, которые я ожидаю использовать MQT - либо:
    • SELECT COUNT (*) FROM FACT_TABLE
    • или SELECT group-dimension, COUNT (*) FROM fact_table GROUP BY group-dimension.
  • Объяснение (используя db2expln) только ссылки на таблицу фактов, а не результаты запроса МКТ
  • показал отсчеты в соответствии с таблицей фактов и не MQT таблицу
  • длительность запроса была совместима с таблицей фактов и не MQT таблицу ,

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

ответ

3

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

1) Хороший совет: DFT_MTTB_TYPES был установлен в SYSTEM. Я изменил это и «ТЕКУЩИЕ ПОДДЕРЖИВАЕМЫЕ ТАБЛИЦЫ ТИПОВ ДЛЯ ОПТИМИЗАЦИИ» как для ПОЛЬЗОВАТЕЛЯ. Все равно никакого эффекта. 2) Спасибо также здесь. У меня оба определены как any или 99999999999999. Это было в 0. Однако я переработал базу данных, сбросил кеш и до сих пор не попал в MQT. Любые другие мысли? – KenFar

+0

Между моим вопросом, вашим ответом и моим первым комментарием, каждый может видеть, что здесь есть ряд факторов. Во время моего первого комментария база данных не использовала MQT, но теперь она есть. Единственное различие заключается в том, что коллега повторил некоторые мои шаги. Возможно, я определил ПОЛЬЗОВАТЕЛЬ с конечным пространством (маловероятно). В любом случае - сейчас он работает. Запросы, которые занимали 20 секунд, теперь работают в 0,5. Спасибо за советы. – KenFar

0

Для отладки вопрос предварять запрос с:

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. 
Смежные вопросы