powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему план запроса правращается в кашу?
8 сообщений из 8, страница 1 из 1
Почему план запроса правращается в кашу?
    #39660921
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую,

есть табличка, на ней индекс по трем полям.

Код: sql
1.
2.
3.
4.
5.
SELECT * 
FROM table1 
WHERE f1=0
AND f2=0
AND f3 IN (1,2,3)


Показывает index_scan, все норм.


Код: sql
1.
2.
3.
4.
5.
SELECT * 
FROM table1 
WHERE f1=0
AND f2=0
AND f3 IN (SELECT id FROM table2)



Показывает
1) Seq_Scan, т.е. полное сканирование таблицы table1
2) Запрос SELECT id FROM table2 на самом деле сложнее, с несколькими join, так в этом случае везде nested loops, а если отедльно выполнить то hash join.

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


Как сделать чтобы в условие IN вставились результаты запроса и при этом план не "поехал" ?
...
Рейтинг: 0 / 0
Почему план запроса правращается в кашу?
    #39660924
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
УткъТак
Код: sql
1.
2.
3.
4.
5.
SELECT * 
FROM table1 
WHERE f1=0
AND f2=0
AND f3 IN (SELECT 1 UNION SELECT 2 UNION SELECT 3)


Показывает тоже норм- index_scan.
...
Рейтинг: 0 / 0
Почему план запроса правращается в кашу?
    #39660925
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ,

Вы бы explain analyze бы показали для обоих случаев.


--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
Почему план запроса правращается в кашу?
    #39660926
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ,

Во-первых, лучше приводить оригинальный план, а не его вольный краткий пересказ.
Во-вторых, PG в случае с подзапросом не может оценить кардинальность выборки и решает, что скан таблицы выгоднее, чем чтение индекса с последующим доступом к таблице.

Для начала - попробуйте переписать IN-запрос в форму джойна с основной таблицей.

По поводу hash / nested - вполне себе логично. При IN-фильтре оптимизатор придерживается стратегии быстрого получения первых строк результата (отсюда вложенные циклы). При выполнении отдельным стейтментом оптимизатор пытается придерживаться стратегии быстрого получения всего результирующего множества (отсюда хэш-соединения).

В терминах и определениях могу путаться. Более знающие товарищи, надуюсь, подправят... :)
...
Рейтинг: 0 / 0
Почему план запроса правращается в кашу?
    #39660931
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаУткъ,

Во-первых, лучше приводить оригинальный план, а не его вольный краткий пересказ.
Во-вторых, PG в случае с подзапросом не может оценить кардинальность выборки и решает, что скан таблицы выгоднее, чем чтение индекса с последующим доступом к таблице.

Для начала - попробуйте переписать IN-запрос в форму джойна с основной таблицей.

По поводу hash / nested - вполне себе логично. При IN-фильтре оптимизатор придерживается стратегии быстрого получения первых строк результата (отсюда вложенные циклы). При выполнении отдельным стейтментом оптимизатор пытается придерживаться стратегии быстрого получения всего результирующего множества (отсюда хэш-соединения).

В терминах и определениях могу путаться. Более знающие товарищи, надуюсь, подправят... :)


Спасибо за ответ.


Просто в table1 на 4 порядка больше данных чем в table2.


Про IN-фильтр не совсем понял. Сейчас переписал через CTE и план стал использовать индекс, хотя запрос выглядит примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
WITH cte AS
(SELECT id FROM table2)
SELECT * 
FROM table1 
WHERE f1=0
AND f2=0
AND f3 IN (SELECT id FROM cte)



Почему когда напрямую запрос вставляю в IN - план превращается в кашу?
...
Рейтинг: 0 / 0
Почему план запроса правращается в кашу?
    #39660933
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim BogukУткъ,

Вы бы explain analyze бы показали для обоих случаев.


--
Maxim Boguk
dataegret.ru


К сожалению, нет такой возможности.
...
Рейтинг: 0 / 0
Почему план запроса правращается в кашу?
    #39660934
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия постгрес 9.5
...
Рейтинг: 0 / 0
Почему план запроса правращается в кашу?
    #39660936
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ,

CTE в PG материализуется во временную таблицу. Оптимизатор каким-то образом рассчитывает "мощность" этой временной таблице (к примеру, считает, что в таблице всего одна строка). В этом случае, получается, что использовать индекс, вроде как, вполне себе выгодно. Когда же запрос написан без CTE, оптимизатор вполне себе понимает, что IN-подзапрос выбирает воз и маленькую тележку данных и вполне резонно считает, что такой фильтр по индексу будет крайне неэффективен.
Вы в планы посмотрите. Там же это всё будет видно. Оценки кардинальностей каждого шага и всё такое....
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему план запроса правращается в кашу?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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