powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Left join медленный запрос
7 сообщений из 32, страница 2 из 2
Left join медленный запрос
    #39998569
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bekass,

тут просто есть очень большая разница выбирать все записи или первые 1000 по скорости... вы то просили все записи получить в исходном запросе и сравнивали с временем получением первых 100-1000 от mysql (о чем не написали опять же).

что показывает
set track_io_timing to on;
explain (analyze, costs, buffers, timing) select geo.* from geo where not exists (select from geo as p where geo.id = p.parent_id) LIMIT 100;

и
set track_io_timing to on;
explain (analyze, costs, buffers, timing) select geo.* from geo where not exists (select from geo as p where geo.id = p.parent_id) ORDER BY geo.id DESC LIMIT 100;

автортот же запрос на POSTGRE https://prnt.sc/uh8w76 на меньшем количестве записей занимает 200с !!!
- а вот это уже вопрос к настройкам базы... 37s я вам и на postgres смогу сделать я думаю без проблем...
какая у вас версия базы?
сколько shared_buffers и какой размер базы?
сколько work_mem?
какие диски (механика или ssd) и какие значения seq_page_cost и random_page_cost в конфиге и effective_cache_size ?


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Left join медленный запрос
    #39998577
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bekass,

У вас автовакуум включен? Таблицу надо отвакуумировать после начального заполнения данными.
...
Рейтинг: 0 / 0
Left join медленный запрос
    #39998591
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bekass,

невероятная разница в скорости для несложной задачи, под которую наверное все оптимизируют.
Трудно уверенно сказать, дело в самом софте, или его настройках. Разработчики postgre наверняка были бы заинтересованы в сценарии который в тысячу раз проигрывает сопернику, если вы сможете предоставить компактное репро.

А как себя ведут похожие запросы, которые оперируют над теми же данными? Тоже есть разница, или LEFT JOIN исключение?

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

Код: sql
1.
2.
3.
select count(*) (select geo.* from geo FULL OUTER JOIN geo as p ON geo.id = p.parent_id where p.id ISNULL); 

select count(*) ((select id from geo) minus (select parent_id from geo))
...
Рейтинг: 0 / 0
Left join медленный запрос
    #39998604
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bekass,

ну так если вы на мускуле делвете лимит 1000, то и на пж сделайте --
Код: sql
1.
explain (analyze, costs, buffers, timing) select geo.* from geo where not exists (select from geo as p where geo.id = p.parent_id) LIMIT 1000; 


и узбагойдезь
...
Рейтинг: 0 / 0
Left join медленный запрос
    #39998651
Bekass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk

set track_io_timing to on;
explain (analyze, costs, buffers, timing) select geo.* from geo where not exists (select from geo as p where geo.id = p.parent_id) LIMIT 100;

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Limit  (cost=8.86..18.06 rows=100 width=49) (actual time=0.024..0.117 rows=100 loops=1)
  Buffers: shared hit=26
  ->  Merge Anti Join  (cost=8.86..1288015.58 rows=13994306 width=49) (actual time=0.023..0.108 rows=100 loops=1)
        Merge Cond: (geo.id = p.parent_id)
        Buffers: shared hit=26
        ->  Index Scan using geo_pkey on geo  (cost=0.43..533612.01 rows=14708238 width=49) (actual time=0.009..0.024 rows=123 loops=1)
              Buffers: shared hit=7
        ->  Index Only Scan using "pkParent" on geo p  (cost=0.43..533780.01 rows=14708238 width=8) (actual time=0.008..0.052 rows=137 loops=1)
              Heap Fetches: 137
              Buffers: shared hit=19
Planning Time: 0.272 ms
Execution Time: 0.140 ms




Maxim Boguk

set track_io_timing to on;
explain (analyze, costs, buffers, timing) select geo.* from geo where not exists (select from geo as p where geo.id = p.parent_id) ORDER BY geo.id DESC LIMIT 100;

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Limit  (cost=0.87..52.70 rows=100 width=49) (actual time=0.027..0.446 rows=100 loops=1)
  Buffers: shared hit=395
  ->  Nested Loop Anti Join  (cost=0.87..7253021.03 rows=13994306 width=49) (actual time=0.025..0.434 rows=100 loops=1)
        Buffers: shared hit=395
        ->  Index Scan Backward using geo_pkey on geo  (cost=0.43..533612.01 rows=14708238 width=49) (actual time=0.013..0.057 rows=122 loops=1)
              Buffers: shared hit=7
        ->  Index Only Scan using "pkParent" on geo p  (cost=0.43..0.85 rows=21 width=8) (actual time=0.002..0.002 rows=0 loops=122)
              Index Cond: (parent_id = geo.id)
              Heap Fetches: 22
              Buffers: shared hit=388
Planning Time: 1.877 ms
Execution Time: 0.490 ms



[quot Maxim Boguk#22196970]

версия базы PostgreSQL 12.4, compiled by Visual C++ build 1914, 64-bit
shared_buffers = 1Gb
work_mem =4MB
seq_page_cost = 1
random_page_cost =4
effective_cache_size = 4GB
диски ssd обе БД в одной системе на одном диске
...
Рейтинг: 0 / 0
Left join медленный запрос
    #39998662
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bekass,

Ну вот вы и получили нужные вам миллисекунды...
как я уже говорил полный результат за быстро вы ни на какой базе не получите... и просил время count(*) на mysql померять чтобы GUI там не развлекалось в получением первых строк вместо полного результата.

Для ssd я бы поставил

shared_buffers = 25% наличной памяти
work_mem =16MB
seq_page_cost = 0.1
random_page_cost =0.11
effective_cache_size = 90%-100% наличной памяти...

но впрочем получение первой тысячи у вас и так быстро отрабатывает.



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Left join медленный запрос
    #39998686
Bekass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk Спасибо за поддержку
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Left join медленный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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