Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос не реврайтится на MQT / 18 сообщений из 18, страница 1 из 1
19.01.2007, 15:41
    #34268614
mitek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
День добрый.
На 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
19.01.2007, 16:15
    #34268748
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
Добрый день.

А почему вы не хотите (или не можете) использовать запрос
Код: plaintext
1.
select * from "DB2ADMIN"."VLIST_MQT"
where date_oper between '2006-10-01' and '2007-01-01'
?
...
Рейтинг: 0 / 0
20.01.2007, 02:00
    #34269581
ротва
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
Может, надо SET CURRENT REFRESH AGE ANY?
...
Рейтинг: 0 / 0
22.01.2007, 07:02
    #34270997
mitek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
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
22.01.2007, 11:43
    #34271557
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
Чтоб оно могло пытаться использовать 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
22.01.2007, 11:45
    #34271568
nkulikov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
Я бы попробовал этот запрос прогнать на 9-ке. Так как на ней можно из db2expln или Visual Explain узнать почему MQT considered, but not choosed.
...
Рейтинг: 0 / 0
22.01.2007, 12:31
    #34271786
mitek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
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
22.01.2007, 13:15
    #34271995
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
mitekЯ подозревал что в этом случае как раз и должно быть переключение на MQT.
Зачем ходить в базовую таблицу, если резалт запроса уже посчитан ???Это вы знаете, что результат одинаковый будет, а база - не знает.
При изменении данных базовых таблиц нигде не определяется, что, мол, для этой конкретной MQT изменения в этих базовых таблицах произошли такие, что она (эта MQT) теперь содержит устаревшие данные.
Это в общем случае довольно нетривиальная, а главное ресурсоемкая задача.
Refresh deffered таблицы для того и сделаны, чтоб можно было получать "довольно близкие" к оригинальнным результаты, пренебрегая этой погрешностью ради производительности.
А вот почему просматриваются базовые таблицы вместо MQT, это отдельный вопрос.
Честно говоря, я никогда не пытался составить запрос так, чтобы оптимизатор реврайтил его на MQT, у меня всегда была возможность явно использовать именно MQT для запросов...
...
Рейтинг: 0 / 0
22.01.2007, 14:15
    #34272255
mitek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
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
22.01.2007, 16:04
    #34272728
mustaccio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
авторосталось выяснить почему он этот предикат считает 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
22.01.2007, 16:16
    #34272767
mitek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
авторПопробуйте в запросе использовать "having date(date_oper) between '2006-10-01-00.00.00.000000' and '2007-01-01-00.00.00.000000'" вместо where
не помогло :(
...
Рейтинг: 0 / 0
22.01.2007, 17:01
    #34272935
mustaccio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
А вы его куда поставили? После всего запроса или в суб-селекте?
...
Рейтинг: 0 / 0
23.01.2007, 07:22
    #34273891
mitek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
авторА вы его куда поставили? После всего запроса или в суб-селекте?
не работает в обоих случаях
...
Рейтинг: 0 / 0
26.01.2007, 13:19
    #34285127
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
статистику собрали? соберите...
...
Рейтинг: 0 / 0
29.01.2007, 07:28
    #34288563
mitek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
статистика всегда up to date
вопрос решил, упростив MQT
...
Рейтинг: 0 / 0
18.01.2008, 17:12
    #35072256
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
В завершение темы... Если стоит REFRESH AGE ANY, ведь это не значит, что данная MQT будет обновляться при изменении базовой таблицы? А с каким отставанием будут происходить обновления?
...
Рейтинг: 0 / 0
18.01.2008, 18:06
    #35072455
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
И еще? Что-то я не догоняю конструкцию REFRESH DEFERRED MAINTAINED BY SYSTEM... Что значит обслуживается системой? Что входит в это обслуживание?
...
Рейтинг: 0 / 0
21.01.2008, 10:10
    #35074970
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос не реврайтится на MQT
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
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос не реврайтится на MQT / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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