|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
Доброго дня уважаемые. Не могу понять как лучше реализовать вот что. contracts_trd - таблица побитая на партиции по idcontracts Хочу получить первую строку в каждой минуте даты Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
И в этом случае сканирует все таблицы партиций. Если перенести условие idcontracts=191 внутрь, то нормально - ищет в одной таблице Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Понял, что row_number() OVER (PARTITION BY (date_trunc('second'::text, tdate))) AS n мешает внешнему условию, если комментирую, то все таблицы перестает сканировать Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Как нужно сделать, чтобы row_number() не мешало внешнему условию фильтровать таблицы партиции? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 06:03 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
frozzen, Вы объясните какой результат вам нужен для начала потому что первые два запроса не эквивалентны совсем. Не считая того что row_number без order by в определении окна - чуть более чем бессмысленный. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 09:33 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
Сортировку в окне ставил, убирал при эксперементах, скопировал сюда ага без сортировки. Нужно разбить строки на группы, каждая группа содержит строки с одной меткой времени с точностью до минуты. Внутри группы строки отсортерованы по полной метке времени. И выбрать из каждой группы первую строку. Проблема, что второй запрос начинает сканировать все таблицы дочернии, я ожидаю что просканирует одну, ту которая соответствует ключу в условии. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 12:05 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
frozzen Сортировку в окне ставил, убирал при эксперементах, скопировал сюда ага без сортировки. Нужно разбить строки на группы, каждая группа содержит строки с одной меткой времени с точностью до минуты. Внутри группы строки отсортерованы по полной метке времени. И выбрать из каждой группы первую строку. Проблема, что второй запрос начинает сканировать все таблицы дочернии, я ожидаю что просканирует одну, ту которая соответствует ключу в условии. Так запросы то разные... первый у вас выберет в каждой группе (без учета idcontracts=191 очевидно) первую строку и далее покажет только те где совпало с тем что у этой первой строки idcontracts=191 (поэтому и без сканирования всех партиций тут никак) а во втором случае оно сначала выберет строки с idcontracts=191 (и тут уже по партиции смотреть можно) и далее выберет по одной строке в каждой группе... Вы сами не видите что результаты разные выдаются? Я потому и спросил "Вы объясните какой результат вам нужен для начала". -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 12:24 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
Результата первого я не смог дождаться для сравнения и начал смотреть план. Что хотел добиться - написать вьюшку, которая будет делать то, что писал выше. Запрос к вьюшке с фильтром по idcontracts. И хотел чтобы запрос во вьюше шел в таблицу, соответствующую idcontracts. И не понял как туда пропихивать это условие. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 12:41 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
frozzen Результата первого я не смог дождаться для сравнения и начал смотреть план. Что хотел добиться - написать вьюшку, которая будет делать то, что писал выше. Запрос к вьюшке с фильтром по idcontracts. И хотел чтобы запрос во вьюше шел в таблицу, соответствующую idcontracts. И не понял как туда пропихивать это условие. Вы так и не ответили какой из 2х результатов вам нужен... от первого запроса или от второго? они блин РАЗНЫЕ о чем я вам тут уже 3тий раз пишу. Впрочем скорее всего ни тот ни другой нормально через view не будут вам условие пробрасывать внутрь запроса с window fuctions. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 13:08 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
Maxim Boguk, спасибо за пояснения. Второй. Придется значит с клиента формировать запрос с подстановкой ИД внутрь ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 13:17 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
Даже скорее сразу обращаться в таблицу, которая соответствует ключу. Хотел как-то универсальней ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 13:38 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
Вот так нормально, к партициям обращается (в каждой таблице лежат данные по одному idcontracts), запрос пойдет к 2 таблицам Код: plsql 1.
а так все таблицы сканит Код: plsql 1. 2.
Что-то не так у меня настроено или так и должно быть с in? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 08:11 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
frozzen Вот так нормально, к партициям обращается (в каждой таблице лежат данные по одному idcontracts), запрос пойдет к 2 таблицам Код: plsql 1.
а так все таблицы сканит Код: plsql 1. 2.
Что-то не так у меня настроено или так и должно быть с in? Так и должно быть, список то таблиц на этапе планирования определяется... а как в случае IN его можно спланировать если не известно что будет в результате подзапроса. Так что при просто explain вариантов кроме как посмотреть на все партиции - нет. Более сложный ответ зависит от того какая версия базы у вас, как она настроена (в части enable_partition_pruning), и какое из 2х возможных вариантов партиционирования используется и каким образом вы смотрели план (через explain или explain analyze) и там могут быть варианты иногда. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 09:21 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
frozzen Вот так нормально, к партициям обращается (в каждой таблице лежат данные по одному idcontracts), запрос пойдет к 2 таблицам Код: plsql 1.
а так все таблицы сканит Код: plsql 1. 2.
Что-то не так у меня настроено или так и должно быть с in? Какая версия PostgreSQL? Отсечение секций на этапе выполнения добавили в 12. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 11:49 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
версия 12 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2020, 13:18 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
enable_partition_pruning - по умолчанию секционирование с использованием наследования ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2020, 13:31 |
|
Почему не пропихивается условие в подзапрос при партиции
|
|||
---|---|---|---|
#18+
frozzen секционирование с использованием наследования Тогда секции только при планировании запроса могут отсекаться, т.е. в случае с подзапросом - никогда. Вижу два варианта исправить. 1. Переходите на декларативное секционирование. Сложнее, дольше, но перспективнее. 2. Разбивайте на два запроса: сначала получите список idcontracts из подзапроса, затем выполняйте delete указывая константы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2020, 15:43 |
|
|
start [/forum/topic.php?fid=53&msg=40009578&tid=1994390]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 261ms |
0 / 0 |