powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос не реврайтится на MQT
18 сообщений из 18, страница 1 из 1
запрос не реврайтится на MQT
    #34268614
mitek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый.
На DB2 8.1.13 создал MQT

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE "DB2ADMIN"."VLIST_MQT"
  AS (with q (date_oper,kod_oper, kod_styk, nom_poezd, index_poezd, kol_vagon,  massa_gruza) 
        as (select date(date_oper) as date_oper, kod_oper, kod_styk, nom_poezd, 
             index_poezd, count(*) as kol_vagon, sum(massa) as massa_gruza
              from db2admin.vlist
              group by date(date_oper), kod_oper, kod_styk, nom_poezd, index_poezd 
      )
      select date_oper, 
               kod_oper, 
               kod_styk, 
               count(*) as kol_poezd, 
               sum(kol_vagon) as kol_vagons, 
               sum(massa_gruza) as massa_gruza_all
      from q
      group by rollup (kod_styk), date_oper, kod_oper)
  DATA INITIALLY DEFERRED
  REFRESH DEFERRED
  ENABLE QUERY OPTIMIZATION
  MAINTAINED BY SYSTEM
  DATA CAPTURE NONE
 IN "USERSPACE1";

порефрешил ее, теперь в ней содержаться агрегаты за 2 года

пускаю запрос (добавил where date_oper between '2006-10-01-00.00.00.000000' and '2007-01-01-00.00.00.000000' )

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with q (date_oper,kod_oper, kod_styk, nom_poezd, index_poezd, kol_vagon,  massa_gruza) 
        as (select date(date_oper) as date_oper, kod_oper, kod_styk, nom_poezd, 
             index_poezd, count(*) as kol_vagon, sum(massa) as massa_gruza
              from db2admin.vlist
	 where date_oper between '2006-10-01-00.00.00.000000' and '2007-01-01-00.00.00.000000' 
              group by date(date_oper), kod_oper, kod_styk, nom_poezd, index_poezd 
      )
      select date_oper, 
               kod_oper, 
               kod_styk, 
               count(*) as kol_poezd, 
               sum(kol_vagon) as kol_vagons, 
               sum(massa_gruza) as massa_gruza_all
      from q
      group by rollup (kod_styk), date_oper, kod_oper

в плане идет работа по базовой таблице DB2ADMIN.VLIST (16 млн записей)
реврайт на MQT срабатывает только если задаю мин. и макс даты из базовой таблицы
а хотелось бы с произвольным диапазоном (агрегаты-то уже есть в mqt-шке)
как бы заставить оптимайзер ее использовать ?
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34268748
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

А почему вы не хотите (или не можете) использовать запрос
Код: plaintext
1.
select * from "DB2ADMIN"."VLIST_MQT"
where date_oper between '2006-10-01' and '2007-01-01'
?
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34269581
ротва
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может, надо SET CURRENT REFRESH AGE ANY?
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34270997
mitek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinА почему вы не хотите (или не можете) использовать запрос

select * from "DB2ADMIN"."VLIST_MQT"
where date_oper between '2006-10-01' and '2007-01-01'
?
Если бы запрос можно было "решить" только на данной MQT так бы и делал :)
Ну на самом деле ситуация примерно такая.
MQT-шка эта будет рефрешится каждую ночь.
Но базовая таблица заполняется неким обработчиком в онлайне и
юзер (с веб-прилы) может задать поиск по диапазону, включающему текущий
день, данные которого еще не обсчитаны в mqt-шке. Собственно изначально
интересует возможность комбинирования готовых данных из mqt и данных из
базовой таблицы, еще не вошедших в mqt. Но вот почему-то реврайт не происходит
даже на обсчитанные диапазоны строк.

Надеюсь выразился не очень туманно :)
REFRESH IMMEDIATE не предлагать
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34271557
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтоб оно могло пытаться использовать MQT, надо
1. SET CURRENT REFRESH AGE ANY
2. уровень оптимизации 2 или >=5.

Попробуйте
with q (date_oper,kod_oper, kod_styk, nom_poezd, index_poezd, kol_vagon, massa_gruza)
as (select date(date_oper) as date_oper, kod_oper, kod_styk, nom_poezd,
index_poezd, count(*) as kol_vagon, sum(massa) as massa_gruza
from db2admin.vlist
where date(date_oper) between '2006-10-01' and '2007-01-01'
group by date(date_oper), kod_oper, kod_styk, nom_poezd, index_poezd
)
select date_oper,
kod_oper,
kod_styk,
count(*) as kol_poezd,
sum(kol_vagon) as kol_vagons,
sum(massa_gruza) as massa_gruza_all
from q
group by rollup (kod_styk), date_oper, kod_oper;

или такое же выражение для date_oper во внешнем селекте.

Но: вы не добьетесь от MQT функциональности искусственного интеллекта:
оно не будет переключаться на MQT, если запрос по датам такой, что все эти даты уже посчитаны и работать с основными таблицами, если запрос по датам такой, что некоторые или все даты еще не посчитаны.
Такую функциональность вам придется разрабатывать на уровне приложения.
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34271568
nkulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы попробовал этот запрос прогнать на 9-ке. Так как на ней можно из db2expln или Visual Explain узнать почему MQT considered, but not choosed.
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34271786
mitek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein Чтоб оно могло пытаться использовать MQT, надо
1. SET CURRENT REFRESH AGE ANY
2. уровень оптимизации 2 или >=5.
В базе выставлено :
DFT_QUERYOPT=5
DFT_REFRESH_AGE=ANY
Mark Barinstein Попробуйте
with q (date_oper,kod_oper, kod_styk, nom_poezd, index_poezd, kol_vagon, massa_gruza)
as (select date(date_oper) as date_oper, kod_oper, kod_styk, nom_poezd,
index_poezd, count(*) as kol_vagon, sum(massa) as massa_gruza
from db2admin.vlist
where date(date_oper) between '2006-10-01' and '2007-01-01'
group by date(date_oper), kod_oper, kod_styk, nom_poezd, index_poezd
)
select date_oper,
kod_oper,
kod_styk,
count(*) as kol_poezd,
sum(kol_vagon) as kol_vagons,
sum(massa_gruza) as massa_gruza_all
from q
group by rollup (kod_styk), date_oper, kod_oper;

или такое же выражение для date_oper во внешнем селекте.
оба варианта бегут по базовой таблице

Mark BarinsteinНо: вы не добьетесь от MQT функциональности искусственного интеллекта:
оно не будет переключаться на MQT, если запрос по датам такой, что все эти даты уже посчитаны

брррр! это как ?
Я подозревал что в этом случае как раз и должно быть переключение на MQT.
Зачем ходить в базовую таблицу, если резалт запроса уже посчитан ???
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34271995
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mitekЯ подозревал что в этом случае как раз и должно быть переключение на MQT.
Зачем ходить в базовую таблицу, если резалт запроса уже посчитан ???Это вы знаете, что результат одинаковый будет, а база - не знает.
При изменении данных базовых таблиц нигде не определяется, что, мол, для этой конкретной MQT изменения в этих базовых таблицах произошли такие, что она (эта MQT) теперь содержит устаревшие данные.
Это в общем случае довольно нетривиальная, а главное ресурсоемкая задача.
Refresh deffered таблицы для того и сделаны, чтоб можно было получать "довольно близкие" к оригинальнным результаты, пренебрегая этой погрешностью ради производительности.
А вот почему просматриваются базовые таблицы вместо MQT, это отдельный вопрос.
Честно говоря, я никогда не пытался составить запрос так, чтобы оптимизатор реврайтил его на MQT, у меня всегда была возможность явно использовать именно MQT для запросов...
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34272255
mitek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nkulikovЯ бы попробовал этот запрос прогнать на 9-ке. Так как на ней можно из db2expln или Visual Explain узнать почему MQT considered, but not choosed
вижл эксплайн на 9-ке на запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with q (date_oper,kod_oper, kod_styk, nom_poezd, index_poezd, kol_vagon, massa_gruza) 
        as (
             select date(date_oper) as date_oper, kod_oper, kod_styk, nom_poezd, 
             index_poezd, count(*) as kol_vagon, sum(massa) as massa_gruza
            from db2admin.vlist
             where date_oper between '2006-10-01-00.00.00.000000' and '2007-01-01-00.00.00.000000'
  	group by date(date_oper), kod_oper, kod_styk, nom_poezd, index_poezd 
        )
       select date_oper, kod_oper, kod_styk, count(*) as kol_poezd, sum(kol_vagon) as kol_vagons, 
                sum(massa_gruza) as massa_gruza_all
       from q
       group by rollup (kod_styk), date_oper, kod_oper;
говорит что :
Код: plaintext
1.
EXP0073W  The following MQT or statistical view was not eligible because one or more data 
filtering predicates from the query could not be matched with the MQT: "DB2ADMIN"."VLIST_MQT".
осталось выяснить почему он этот предикат считает not matched
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34272728
mustaccio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторосталось выяснить почему он этот предикат считает not matched

Мне кажется, причина вот в чем: в запросе условие "date_oper between '2006-10-01-00.00.00.000000' and '2007-01-01-00.00.00.000000'" оценивается до группировки, и в сгруппированые данные попадают только записи, удовлетворяющие этому условию. В MQT _все_ данные группируются, и "вытащить" из них только те, которые удовлетворяют условию, невозможно.

Попробуйте в запросе использовать "having date(date_oper) between '2006-10-01-00.00.00.000000' and '2007-01-01-00.00.00.000000'" вместо where.
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34272767
mitek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПопробуйте в запросе использовать "having date(date_oper) between '2006-10-01-00.00.00.000000' and '2007-01-01-00.00.00.000000'" вместо where
не помогло :(
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34272935
mustaccio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы его куда поставили? После всего запроса или в суб-селекте?
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34273891
mitek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА вы его куда поставили? После всего запроса или в суб-селекте?
не работает в обоих случаях
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34285127
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
статистику собрали? соберите...
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #34288563
mitek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
статистика всегда up to date
вопрос решил, упростив MQT
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #35072256
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В завершение темы... Если стоит REFRESH AGE ANY, ведь это не значит, что данная MQT будет обновляться при изменении базовой таблицы? А с каким отставанием будут происходить обновления?
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #35072455
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще? Что-то я не догоняю конструкцию REFRESH DEFERRED MAINTAINED BY SYSTEM... Что значит обслуживается системой? Что входит в это обслуживание?
...
Рейтинг: 0 / 0
запрос не реврайтится на MQT
    #35074970
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTВ завершение темы... Если стоит REFRESH AGE ANY, ведь это не значит, что данная MQT будет обновляться при изменении базовой таблицы? А с каким отставанием будут происходить обновления?При изменении базовых таблиц только mqt с refresh immediate опцией обновляется сразу.
mqt всех остальных видов будут обновляться, как только вы выдадите соответсвующие команды.
TORTИ еще? Что-то я не догоняю конструкцию REFRESH DEFERRED MAINTAINED BY SYSTEM... Что значит обслуживается системой? Что входит в это обслуживание?MAINTAINED BY SYSTEM означает, что обновлением содержимого этой таблицы занимается система, и делается это автоматически для REFRESH IMMEDIATE, с помощью REFRESH TABLE (выдает пользователь, когда ему надо) для REFRESH DEFERRED mqt.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос не реврайтится на MQT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]