|
Почему план запроса правращается в кашу?
|
|||
---|---|---|---|
#18+
Приветствую, есть табличка, на ней индекс по трем полям. Код: sql 1. 2. 3. 4. 5.
Показывает index_scan, все норм. Код: sql 1. 2. 3. 4. 5.
Показывает 1) Seq_Scan, т.е. полное сканирование таблицы table1 2) Запрос SELECT id FROM table2 на самом деле сложнее, с несколькими join, так в этом случае везде nested loops, а если отедльно выполнить то hash join. Временные таблицы создавать нельзя, т.к. реплика. Как сделать чтобы в условие IN вставились результаты запроса и при этом план не "поехал" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2018, 18:22 |
|
Почему план запроса правращается в кашу?
|
|||
---|---|---|---|
#18+
УткъТак Код: sql 1. 2. 3. 4. 5.
Показывает тоже норм- index_scan. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2018, 18:26 |
|
Почему план запроса правращается в кашу?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2018, 18:31 |
|
Почему план запроса правращается в кашу?
|
|||
---|---|---|---|
#18+
Уткъ, Во-первых, лучше приводить оригинальный план, а не его вольный краткий пересказ. Во-вторых, PG в случае с подзапросом не может оценить кардинальность выборки и решает, что скан таблицы выгоднее, чем чтение индекса с последующим доступом к таблице. Для начала - попробуйте переписать IN-запрос в форму джойна с основной таблицей. По поводу hash / nested - вполне себе логично. При IN-фильтре оптимизатор придерживается стратегии быстрого получения первых строк результата (отсюда вложенные циклы). При выполнении отдельным стейтментом оптимизатор пытается придерживаться стратегии быстрого получения всего результирующего множества (отсюда хэш-соединения). В терминах и определениях могу путаться. Более знающие товарищи, надуюсь, подправят... :) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2018, 18:36 |
|
Почему план запроса правращается в кашу?
|
|||
---|---|---|---|
#18+
Щукина АннаУткъ, Во-первых, лучше приводить оригинальный план, а не его вольный краткий пересказ. Во-вторых, PG в случае с подзапросом не может оценить кардинальность выборки и решает, что скан таблицы выгоднее, чем чтение индекса с последующим доступом к таблице. Для начала - попробуйте переписать IN-запрос в форму джойна с основной таблицей. По поводу hash / nested - вполне себе логично. При IN-фильтре оптимизатор придерживается стратегии быстрого получения первых строк результата (отсюда вложенные циклы). При выполнении отдельным стейтментом оптимизатор пытается придерживаться стратегии быстрого получения всего результирующего множества (отсюда хэш-соединения). В терминах и определениях могу путаться. Более знающие товарищи, надуюсь, подправят... :) Спасибо за ответ. Просто в table1 на 4 порядка больше данных чем в table2. Про IN-фильтр не совсем понял. Сейчас переписал через CTE и план стал использовать индекс, хотя запрос выглядит примерно так: Код: sql 1. 2. 3. 4. 5. 6. 7.
Почему когда напрямую запрос вставляю в IN - план превращается в кашу? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2018, 18:53 |
|
Почему план запроса правращается в кашу?
|
|||
---|---|---|---|
#18+
Maxim BogukУткъ, Вы бы explain analyze бы показали для обоих случаев. -- Maxim Boguk dataegret.ru К сожалению, нет такой возможности. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2018, 18:54 |
|
Почему план запроса правращается в кашу?
|
|||
---|---|---|---|
#18+
Версия постгрес 9.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2018, 18:57 |
|
Почему план запроса правращается в кашу?
|
|||
---|---|---|---|
#18+
Уткъ, CTE в PG материализуется во временную таблицу. Оптимизатор каким-то образом рассчитывает "мощность" этой временной таблице (к примеру, считает, что в таблице всего одна строка). В этом случае, получается, что использовать индекс, вроде как, вполне себе выгодно. Когда же запрос написан без CTE, оптимизатор вполне себе понимает, что IN-подзапрос выбирает воз и маленькую тележку данных и вполне резонно считает, что такой фильтр по индексу будет крайне неэффективен. Вы в планы посмотрите. Там же это всё будет видно. Оценки кардинальностей каждого шага и всё такое.... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2018, 18:59 |
|
|
start [/forum/topic.php?fid=53&msg=39660921&tid=1995727]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
265ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 18ms |
total: | 372ms |
0 / 0 |