Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT / 10 сообщений из 10, страница 1 из 1
04.02.2016, 11:42
    #39162782
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
FB 2.5

1. Есть набор временных таблиц. На транзакцию.

2. На эти таблицы созданы индексы на связки и еще один на данные
Код: sql
1.
create index TMP$VALUES_AV on TMP$VALUES( ID_ATTRIBUTE, ATTRIBUTE_VALUE)



3. Есть ХП, которая набивает таблицы данными, потом собирает по ним агрегаты.

4. Все, кроме связок (ATTRIBUTE_VALUE, :D1, :D2) - текст(varchar(70)) . Связки - bigint.

Запрос, 30 раз выполненый внутри ХП, дает 10 млн. фетчей
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            select  coalesce(count(distinct vACC.ATTRIBUTE_VALUE), 0)
             from TMP$VALUES vTS
                  join TMP$ITEMS i on vTS.ID_ITEM = i.ID and vTS.ID_ATTRIBUTE = -10
                  join TMP$VALUES vACC on vACC.ID_ITEM = i.ID and vACC.ID_ATTRIBUTE = -16
             where vTS.ID_ATTRIBUTE = -10 and vTS.ATTRIBUTE_VALUE between :D1 and :D2
             into :S1;

Fetches: 15 322 275
|TMP$ITEMS                      |         0 |         0 |     1434866 |       0 |       0 |   46286 |        0 |        0 |        0 |
|TMP$VALUES                     |         0 |   1481152 |           0 |       0 |       0 |  138858 |        0 |        0 |        0 |



Этот же запрос, выполненный ПОСЛЕ процедуры (есс-но в той же транзакции) на 1/30 диапазона. Распределение данных более-менее равномерное.

Код: sql
1.
2.
|TMP$ITEMS                      |         0 |      2337 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
|TMP$VALUES                     |         0 |      4674 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |



И это можно было бы понять, но! Если обернуть сбор агрегата в execute statement, то тот же самый запрос в те же 30 раз этих самых 10 млн. фетчей не дает. 5 млн - первоначальная набивка данных.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            execute statement 'select  coalesce(count(distinct vACC.ATTRIBUTE_VALUE), 0)
             from TMP$VALUES vTS
                  join TMP$ITEMS i on vTS.ID_ITEM = i.ID and vTS.ID_ATTRIBUTE = -10
                  join TMP$VALUES vACC on vACC.ID_ITEM = i.ID and vACC.ID_ATTRIBUTE = -16
             where vTS.ID_ATTRIBUTE = -10 and vTS.ATTRIBUTE_VALUE between ''' || :D1 || ''' and '''|| :D2 || ''''
             into :S1;

Fetches: 5 586 303
|TMP$ITEMS                      |         0 |     46286 |           0 |       0 |       0 |   46286 |        0 |        0 |        0 |
|TMP$VALUES                     |         0 |     92572 |           0 |       0 |       0 |  138858 |        0 |        0 |        0 |



Ну и собственно вопрос: Как дальше жить?
...
Рейтинг: 0 / 0
10.02.2016, 12:56
    #39167514
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
pastor,

чем фетчи меряешь. IBExpert'ом?
Раз FB2.5 то скорее всего CS или SC. Значит счётчики фетчей разные на каждое соединение. Есть подозрение что счётчики фетчей ES не попадают в общую статистику. Попробуй померить трейсом, там точнее должно быть.
...
Рейтинг: 0 / 0
10.02.2016, 13:31
    #39167550
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
pastor,

планы запросов внутри процедуры и в ES разные, судя по статистике ?
Вообще - нифига не понятно - в чём проблема ?

PS
pastorЗапрос, 30 раз выполненый внутри ХП, дает 10 млн. фетчей
...
Код: sql
1.
Fetches: 15 322 275

Не получается...

PPS воспроизводимый пример снимет бОльшую часть вопросов
...
Рейтинг: 0 / 0
10.02.2016, 14:02
    #39167598
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
hvladpastor,

планы запросов внутри процедуры и в ES разные, судя по статистике ?
Вообще - нифига не понятно - в чём проблема ?

PS
pastorЗапрос, 30 раз выполненый внутри ХП, дает 10 млн. фетчей
...
Код: sql
1.
Fetches: 15 322 275

Не получается...

PPS воспроизводимый пример снимет бОльшую часть вопросов

1. планы разные.
проблема в этом. хочу внутри процедуры такой же план.

2. получается, получается :) 5 млн - первоначальное заполнение таблиц.

3. сделаю.
...
Рейтинг: 0 / 0
10.02.2016, 14:21
    #39167621
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
pastor,

а чего параметры в execute statement не используешь? В 2.5 ведь можно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
stmt = 'select  coalesce(count(distinct vACC.ATTRIBUTE_VALUE), 0)
             from TMP$VALUES vTS
                  join TMP$ITEMS i on vTS.ID_ITEM = i.ID and vTS.ID_ATTRIBUTE = -10
                  join TMP$VALUES vACC on vACC.ID_ITEM = i.ID and vACC.ID_ATTRIBUTE = -16
             where vTS.ID_ATTRIBUTE = -10 and vTS.ATTRIBUTE_VALUE between :D1 and :D2';

EXECUTE STATEMENT (stmt) (d1 := d1, d2 := d2);
...
Рейтинг: 0 / 0
10.02.2016, 15:27
    #39167697
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
pastor1. планы разные.
проблема в этом. хочу внутри процедуры такой же план.Таблицы наполнились, план поменялся
...
Рейтинг: 0 / 0
10.02.2016, 15:40
    #39167716
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
hvladpastor1. планы разные.
проблема в этом. хочу внутри процедуры такой же план.Таблицы наполнились, план поменялся

а делать-то что?

разносить наполнение и анализ по разным процедурам?

или есть еще какой-нить лайфхак устроить сэйвпоинт внутри процедуры?
...
Рейтинг: 0 / 0
10.02.2016, 15:44
    #39167723
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
pastor,

не поможет
...
Рейтинг: 0 / 0
10.02.2016, 15:50
    #39167727
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
pastor,

не понял причём тут сейвпойт. Проблема если я правильно понял, заключается в том что для этого запроса план составляется на этапе загрузки ХП в кэш метаданных. А тогда данных в таблицах ещё нет. Для EXECUTE STATEMENT плана заранее составлено быть не может, поэтому он каждый раз анализирует запрос и составляет план заново.

Попробуй зафиксировать в запросе план хинтами (+0)
...
Рейтинг: 0 / 0
10.02.2016, 16:44
    #39167792
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
Симонов Денисpastor,

не понял причём тут сейвпойт. Проблема если я правильно понял, заключается в том что для этого запроса план составляется на этапе загрузки ХП в кэш метаданных. А тогда данных в таблицах ещё нет. Для EXECUTE STATEMENT плана заранее составлено быть не может, поэтому он каждый раз анализирует запрос и составляет план заново.

Попробуй зафиксировать в запросе план хинтами (+0)

хинтами там не прибьешь. есть составной индекс точно по условию выборки.

таки придется поделить на две процедуры - набивалка и разбиралка.

PS. при просмотре зависимостей на эти временные таблички, похожие разделенные набивалки и разбиралки нашлись. при просмотре лога svn выяснилось, что делал это я. видимо, забыл где лежит рецепт на таблетки от склероза.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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