powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему не пропихивается условие в подзапрос при партиции
15 сообщений из 15, страница 1 из 1
Почему не пропихивается условие в подзапрос при партиции
    #40009542
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня уважаемые. Не могу понять как лучше реализовать вот что.
contracts_trd - таблица побитая на партиции по idcontracts

Хочу получить первую строку в каждой минуте даты
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t1.idcontracts,
                    t1.dt,
                    t1.tprice
        FROM (SELECT idcontracts,
                         row_number() OVER (PARTITION BY (date_trunc('minute'::text, tdate))) AS n,
                         date_trunc('minute'::text, tdate) AS dt,
                         tprice
                  FROM contracts_trd
                  WHERE inuse = 1
                  ) t1
            WHERE t1.idcontracts=191 and t1.n = 1



И в этом случае сканирует все таблицы партиций. Если перенести условие idcontracts=191 внутрь, то нормально - ищет в одной таблице

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t1.idcontracts,
                    t1.dt,
                    t1.tprice
        FROM (SELECT idcontracts,
                         row_number() OVER (PARTITION BY (date_trunc('minute'::text, tdate))) AS n,
                         date_trunc('minute'::text, tdate) AS dt,
                         tprice
                  FROM contracts_trd
                  WHERE idcontracts=191 and  inuse = 1
                  ) t1
            WHERE t1.n = 1



Понял, что row_number() OVER (PARTITION BY (date_trunc('second'::text, tdate))) AS n мешает внешнему условию, если комментирую, то все таблицы перестает сканировать

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT t1.idcontracts,
                    t1.dt,
                    t1.tprice
        FROM (SELECT idcontracts,
                         date_trunc('minute'::text, tdate) AS dt,
                         tprice
                  FROM contracts_trd
                  WHERE inuse = 1
                  ) t1
            WHERE t1.idcontracts=191 



Как нужно сделать, чтобы row_number() не мешало внешнему условию фильтровать таблицы партиции?
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40009555
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
frozzen,

Вы объясните какой результат вам нужен для начала
потому что первые два запроса не эквивалентны совсем.

Не считая того что row_number без order by в определении окна - чуть более чем бессмысленный.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40009569
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сортировку в окне ставил, убирал при эксперементах, скопировал сюда ага без сортировки.

Нужно разбить строки на группы, каждая группа содержит строки с одной меткой времени с точностью до минуты. Внутри группы строки отсортерованы по полной метке времени. И выбрать из каждой группы первую строку.

Проблема, что второй запрос начинает сканировать все таблицы дочернии, я ожидаю что просканирует одну, ту которая соответствует ключу в условии.
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40009570
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
frozzen
Сортировку в окне ставил, убирал при эксперементах, скопировал сюда ага без сортировки.

Нужно разбить строки на группы, каждая группа содержит строки с одной меткой времени с точностью до минуты. Внутри группы строки отсортерованы по полной метке времени. И выбрать из каждой группы первую строку.

Проблема, что второй запрос начинает сканировать все таблицы дочернии, я ожидаю что просканирует одну, ту которая соответствует ключу в условии.


Так запросы то разные...
первый у вас выберет в каждой группе (без учета idcontracts=191 очевидно) первую строку и далее покажет только те где совпало с тем что у этой первой строки idcontracts=191
(поэтому и без сканирования всех партиций тут никак)

а во втором случае оно сначала выберет строки с idcontracts=191 (и тут уже по партиции смотреть можно) и далее выберет по одной строке в каждой группе...

Вы сами не видите что результаты разные выдаются?
Я потому и спросил "Вы объясните какой результат вам нужен для начала".

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40009572
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Результата первого я не смог дождаться для сравнения и начал смотреть план.

Что хотел добиться - написать вьюшку, которая будет делать то, что писал выше.
Запрос к вьюшке с фильтром по idcontracts. И хотел чтобы запрос во вьюше шел в таблицу, соответствующую idcontracts.
И не понял как туда пропихивать это условие.
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40009577
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
frozzen
Результата первого я не смог дождаться для сравнения и начал смотреть план.

Что хотел добиться - написать вьюшку, которая будет делать то, что писал выше.
Запрос к вьюшке с фильтром по idcontracts. И хотел чтобы запрос во вьюше шел в таблицу, соответствующую idcontracts.
И не понял как туда пропихивать это условие.


Вы так и не ответили какой из 2х результатов вам нужен...
от первого запроса или от второго? они блин РАЗНЫЕ о чем я вам тут уже 3тий раз пишу.

Впрочем скорее всего ни тот ни другой нормально через view не будут вам условие пробрасывать внутрь запроса с window fuctions.
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40009578
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk, спасибо за пояснения.

Второй.
Придется значит с клиента формировать запрос с подстановкой ИД внутрь
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40009580
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже скорее сразу обращаться в таблицу, которая соответствует ключу. Хотел как-то универсальней
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40015142
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так нормально, к партициям обращается (в каждой таблице лежат данные по одному idcontracts), запрос пойдет к 2 таблицам
Код: plsql
1.
explain delete from contracts_trades where idcontracts  in (1456,1443);



а так все таблицы сканит

Код: plsql
1.
2.
explain delete from contracts_trades where idcontracts  in (
select idcontracts from contracts mc where shortname ~ 'Cad.*')



Что-то не так у меня настроено или так и должно быть с in?
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40015148
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
frozzen
Вот так нормально, к партициям обращается (в каждой таблице лежат данные по одному idcontracts), запрос пойдет к 2 таблицам
Код: plsql
1.
explain delete from contracts_trades where idcontracts  in (1456,1443);



а так все таблицы сканит

Код: plsql
1.
2.
explain delete from contracts_trades where idcontracts  in (
select idcontracts from contracts mc where shortname ~ 'Cad.*')



Что-то не так у меня настроено или так и должно быть с in?


Так и должно быть, список то таблиц на этапе планирования определяется... а как в случае IN его можно спланировать если не известно что будет в результате подзапроса. Так что при просто explain вариантов кроме как посмотреть на все партиции - нет.

Более сложный ответ зависит от того какая версия базы у вас, как она настроена (в части enable_partition_pruning), и какое из 2х возможных вариантов партиционирования используется и каким образом вы смотрели план (через explain или explain analyze) и там могут быть варианты иногда.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40015173
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
frozzen
Вот так нормально, к партициям обращается (в каждой таблице лежат данные по одному idcontracts), запрос пойдет к 2 таблицам
Код: plsql
1.
explain delete from contracts_trades where idcontracts  in (1456,1443);



а так все таблицы сканит

Код: plsql
1.
2.
explain delete from contracts_trades where idcontracts  in (
select idcontracts from contracts mc where shortname ~ 'Cad.*')



Что-то не так у меня настроено или так и должно быть с in?

Какая версия PostgreSQL?
Отсечение секций на этапе выполнения добавили в 12.
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40015530
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
версия 12
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40015535
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
enable_partition_pruning - по умолчанию
секционирование с использованием наследования
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40015584
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
frozzen
секционирование с использованием наследования

Тогда секции только при планировании запроса могут отсекаться, т.е. в случае с подзапросом - никогда.

Вижу два варианта исправить.
1. Переходите на декларативное секционирование. Сложнее, дольше, но перспективнее.
2. Разбивайте на два запроса: сначала получите список idcontracts из подзапроса, затем выполняйте delete указывая константы.
...
Рейтинг: 0 / 0
Почему не пропихивается условие в подзапрос при партиции
    #40016078
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за пояснение.
Делал ага по второму варианту
и сейчас поизучаю первый
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему не пропихивается условие в подзапрос при партиции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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