Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему план запроса правращается в кашу? / 8 сообщений из 8, страница 1 из 1
14.06.2018, 18:22
    #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
14.06.2018, 18:26
    #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
14.06.2018, 18:31
    #39660925
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему план запроса правращается в кашу?
Уткъ,

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


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

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

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

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

В терминах и определениях могу путаться. Более знающие товарищи, надуюсь, подправят... :)
...
Рейтинг: 0 / 0
14.06.2018, 18:53
    #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
14.06.2018, 18:54
    #39660933
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему план запроса правращается в кашу?
Maxim BogukУткъ,

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


--
Maxim Boguk
dataegret.ru


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

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


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