powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
10 сообщений из 10, страница 1 из 1
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
    #39162782
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
    #39167514
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,

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

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

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

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

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

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

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

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

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

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

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

3. сделаю.
...
Рейтинг: 0 / 0
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
    #39167621
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
    #39167697
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor1. планы разные.
проблема в этом. хочу внутри процедуры такой же план.Таблицы наполнились, план поменялся
...
Рейтинг: 0 / 0
Использование индексов на временных таблицах внутри процедур с и без EXECUTE STATEMENT
    #39167716
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladpastor1. планы разные.
проблема в этом. хочу внутри процедуры такой же план.Таблицы наполнились, план поменялся

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

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

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

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

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

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

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

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

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

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

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


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