powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация запроса
25 сообщений из 57, страница 2 из 3
оптимизация запроса
    #38129026
Viacheslav_mihalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такое подозрение, что сами запросы выполняются быстро,
а основное время идет на вывод 50000 записей на экран...
...
Рейтинг: 0 / 0
оптимизация запроса
    #38129909
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav_mihalichТакое подозрение, что сами запросы выполняются быстро,
а основное время идет на вывод 50000 записей на экран...

это как раз часть:
б)прием ответа клиентов

(прием ответа отрисовка и тд)...

о которой я писал...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
оптимизация запроса
    #38931517
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
      sql := 'SELECT paths.seq, edges.* ' 
           ||'FROM '|| algo ||' (''SELECT * FROM (SELECT * FROM ' || addedges
           ||' UNION ALL SELECT * FROM ' || edges || ') AS graph '               
           ||'WHERE id NOT IN (SELECT gid FROM ' || deledges || ') '
           || 'AND source NOT IN (SELECT gid FROM ' || delnodes || ') '
           || 'AND target NOT IN (SELECT gid FROM ' || delnodes || ') '
           || CASE WHEN prohibited IS NOT NULL THEN
              'AND NOT st_intersects(the_geom, '
           || 'geomfromewkt('''||quote_literal(st_asewkt(prohibited))||''')) '
              ELSE '' END
           || CASE WHEN band IS NOT NULL THEN  
              'AND st_intersects(the_geom, '
           || 'geomfromewkt('''||quote_literal(st_asewkt(band))||''')) '
              ELSE '' END
           ||''', ' || source || ', ' || target
           ||', false, false) AS paths, '
           ||'(SELECT * FROM ' || addedges
           ||' UNION ALL SELECT * FROM ' || edges || ') AS edges '
           ||'WHERE paths.id2 = edges.id '
           ||'ORDER BY seq;';
...
Рейтинг: 0 / 0
оптимизация запроса
    #38931521
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pcadviser
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 
Помогите оптимизировать запрос :

      sql := 'SELECT paths.seq, edges.* ' 
           ||'FROM '|| algo ||' (''SELECT * FROM (SELECT * FROM ' || addedges
           ||' UNION ALL SELECT * FROM ' || edges || ') AS graph '               
           ||'WHERE id NOT IN (SELECT gid FROM ' || deledges || ') '
           || 'AND source NOT IN (SELECT gid FROM ' || delnodes || ') '
           || 'AND target NOT IN (SELECT gid FROM ' || delnodes || ') '
           || CASE WHEN prohibited IS NOT NULL THEN
              'AND NOT st_intersects(the_geom, '
           || 'geomfromewkt('''||quote_literal(st_asewkt(prohibited))||''')) '
              ELSE '' END
           || CASE WHEN band IS NOT NULL THEN  
              'AND st_intersects(the_geom, '
           || 'geomfromewkt('''||quote_literal(st_asewkt(band))||''')) '
              ELSE '' END
           ||''', ' || source || ', ' || target
           ||', false, false) AS paths, '
           ||'(SELECT * FROM ' || addedges
           ||' UNION ALL SELECT * FROM ' || edges || ') AS edges '
           ||'WHERE paths.id2 = edges.id '
           ||'ORDER BY seq;';
...
Рейтинг: 0 / 0
оптимизация запроса
    #38931938
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pcadviserpcadviser
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 
Помогите оптимизировать запрос :

      sql := 'SELECT paths.seq, edges.* ' 
           ||'FROM '|| algo ||' (''SELECT * FROM (SELECT * FROM ' || addedges
           ||' UNION ALL SELECT * FROM ' || edges || ') AS graph '               
           ||'WHERE id NOT IN (SELECT gid FROM ' || deledges || ') '
           || 'AND source NOT IN (SELECT gid FROM ' || delnodes || ') '
           || 'AND target NOT IN (SELECT gid FROM ' || delnodes || ') '
           || CASE WHEN prohibited IS NOT NULL THEN
              'AND NOT st_intersects(the_geom, '
           || 'geomfromewkt('''||quote_literal(st_asewkt(prohibited))||''')) '
              ELSE '' END
           || CASE WHEN band IS NOT NULL THEN  
              'AND st_intersects(the_geom, '
           || 'geomfromewkt('''||quote_literal(st_asewkt(band))||''')) '
              ELSE '' END
           ||''', ' || source || ', ' || target
           ||', false, false) AS paths, '
           ||'(SELECT * FROM ' || addedges
           ||' UNION ALL SELECT * FROM ' || edges || ') AS edges '
           ||'WHERE paths.id2 = edges.id '
           ||'ORDER BY seq;';



1)почему не в новой теме?
2)приведите результаты explain (analyze, costs, buffers, timing) ваш запрос; тогда и посмотрим.

PS: NOT IN использовать с подзапросом идея плохая в 90% случаев.

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
оптимизация запроса
    #38932933
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. на сайте недавно, не знал - что нужно в новой теме, учту

протестировал отдельно подзапрос с NOT IN - ми

Код: sql
1.
2.
3.
4.
5.
              SELECT * FROM (SELECT * FROM road_addedges 
              UNION ALL SELECT * FROM road.edges) AS graph WHERE 
              id NOT IN (SELECT gid FROM road_deledges) AND 
              source NOT IN (SELECT gid FROM road_delnodes) AND 
              target NOT IN (SELECT gid FROM road_delnodes)



Result (cost=120.00..905453.17 rows=1102808 width=494) (actual time=0.025..5114.715 rows=8822060 loops=1)

наверное можно переписать запрос через RIGHT OUTER JOIN ?
...
Рейтинг: 0 / 0
оптимизация запроса
    #38932936
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukpcadviserпропущено...


1)почему не в новой теме?
2)приведите результаты explain (analyze, costs, buffers, timing) ваш запрос; тогда и посмотрим.

PS: NOT IN использовать с подзапросом идея плохая в 90% случаев.

--Maxim Boguk
www.postgresql-consulting.ru

1. на сайте недавно, не знал - что нужно в новой теме, учту

протестировал отдельно подзапрос с NOT IN - ми
Код: sql
1.
2.
3.
4.
5.
              SELECT * FROM (SELECT * FROM road_addedges 
              UNION ALL SELECT * FROM road.edges) AS graph WHERE 
              id NOT IN (SELECT gid FROM road_deledges) AND 
              source NOT IN (SELECT gid FROM road_delnodes) AND 
              target NOT IN (SELECT gid FROM road_delnodes)



Result (cost=120.00..905453.17 rows=1102808 width=494) (actual time=0.025..5114.715 rows=8822060 loops=1)

наверное можно переписать запрос через RIGHT OUTER JOIN ?
...
Рейтинг: 0 / 0
оптимизация запроса
    #38932980
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pcadviser,

попробуйте

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT * 
FROM 
(
  SELECT * 
  FROM road_addedges 
  UNION ALL 
  SELECT * 
  FROM road.edges
) AS graph 
LEFT JOIN
road_deledges AS rd
ON graph.id = rd.gid
LEFT JOIN
road_delnodes AS rdns
ON source = rdns.gid
LEFT JOIN
road_delnodes AS rdnt
ON target = rdnt.gid
WHERE 
  rd.gid IS NULL AND
  rdns.gid IS NULL AND
  rdnt.gid IS NULL
...
Рейтинг: 0 / 0
оптимизация запроса
    #38932987
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pcadviser,

или так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT * 
FROM 
(
  SELECT * 
  FROM road_addedges 
  UNION ALL 
  SELECT * 
  FROM road.edges
) AS graph
WHERE 
NOT EXISTS (
  SELECT 1 FROM road_deledges AS rd WHERE rd.gid = graph.id
) AND
NOT EXISTS (
  SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.source
) AND
NOT EXISTS (
  SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.target
)
...
Рейтинг: 0 / 0
оптимизация запроса
    #38932989
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pcadviser,

и да, Махим вас просил:

Maxim Boguk 2)приведите результаты explain (analyze, costs, buffers, timing) ваш запрос; тогда и посмотрим.
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933049
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там не суть важно, как это фильтровать по этому условию
думаю, основная мякотка -- в наличии/отсутствии gist индексов по геометриям.
(не тащат же они 8 лямов записей из запроса )


2ТС: лениво раскрывать динамику -- приведите конечный текст запроса (а не строку сборки) в одном из вариантов параметров
желательно -- нормально отформатированную.
и вообще -- там у вас видится вызов динамики вложенный ['(''SELECT ...], что забавно.
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933128
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqтам не суть важно, как это фильтровать по этому условию
думаю, основная мякотка -- в наличии/отсутствии gist индексов по геометриям.
(не тащат же они 8 лямов записей из запроса )


2ТС: лениво раскрывать динамику -- приведите конечный текст запроса (а не строку сборки) в одном из вариантов параметров
желательно -- нормально отформатированную.
и вообще -- там у вас видится вызов динамики вложенный ['(''SELECT ...], что забавно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
explain (analyze, costs, buffers) 
SELECT paths.seq, edges.* 
FROM pgr_astar ('SELECT * FROM (SELECT * FROM road_addedges UNION ALL SELECT * FROM road.edges) AS graph 
WHERE id NOT IN (SELECT gid FROM road_deledges) 
AND source NOT IN (SELECT gid FROM road_delnodes) 
AND target NOT IN (SELECT gid FROM road_delnodes) 
AND NOT st_intersects(the_geom, geomfromewkt(''SRID=4326;POLYGON((53 52,51 56,55 56,53 52))'')) ', 7000528, 7000530, false, false) AS paths, 
(SELECT * FROM road_addedges UNION ALL SELECT * FROM road.edges) AS edges 
WHERE paths.id2 = edges.id
ORDER BY seq;



результат :

Sort (cost=15564684.21..15674965.05 rows=44112335 width=498) (actual time=26819.681..26820.040 rows=6663 loops=1)
Sort Key: paths.seq
Sort Method: quicksort Memory: 2678kB
Buffers: shared hit=49986 read=728492, local hit=6671
-> Nested Loop (cost=0.00..12468.32 rows=44112335 width=498) (actual time=26790.620..26816.858 rows=6663 loops=1)
Join Filter: (paths.id2 = road_addedges.id)
Buffers: shared hit=49986 read=728492, local hit=6671
-> Function Scan on pgr_astar paths (cost=0.00..10.00 rows=1000 width=8) (actual time=26790.595..26791.357 rows=6664 loops=1)
Buffers: shared hit=23267 read=728492, local hit=3
Buffers: shared hit=26719, local hit=6668
-> Index Scan using edges_gid_idx on road_addedges (cost=0.00..0.32 rows=1 width=152) (actual time=0.000..0.000 rows=0 loops=6664)
Index Cond: (road_addedges.id = paths.id2)
Buffers: local hit=6668
-> Index Scan using edges_gid_idx on edges (cost=0.00..12.12 rows=1 width=494) (actual time=0.003..0.003 rows=1 loops=6664)
Index Cond: (road.edges.id = paths.id2)
Buffers: shared hit=26719
Total runtime: 26820.381 ms
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933134
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

пропустил строчку

Append (cost=0.00..12.43 rows=2 width=323) (actual time=0.003..0.003 rows=1 loops=6664)
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933137
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,

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

у вас все время ожидаемо уходит на вызов функции pgr_astar
теперь берем все запросы внутри этой функции и поштучно анализируем что именно тормозит.

PS: из того что я вижу скорее всего тормозит диск и базе надо больше памяти чтобы она нормально там размещалась. Включить track_io_timing и прогоните еще раз тот же explain analyze.

PPS: когда я вижу куски SQL передаваемые параметрами в хранимку я уже могу предсказать что там все будет криво (так как так делать не надо никогда это исключительно кривой дизайн).

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933151
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukpcadviser,

у вас все время ожидаемо уходит на вызов функции pgr_astar
теперь берем все запросы внутри этой функции и поштучно анализируем что именно тормозит.

PS: из того что я вижу скорее всего тормозит диск и базе надо больше памяти чтобы она нормально там размещалась. Включить track_io_timing и прогоните еще раз тот же explain analyze.

PPS: когда я вижу куски SQL передаваемые параметрами в хранимку я уже могу предсказать что там все будет криво (так как так делать не надо никогда это исключительно кривой дизайн).

--Maxim Boguk
www.postgresql-consulting.ru

Включить track_io_timing нет возможности, так как версия postgres - 9.0
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933157
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PPS: когда я вижу куски SQL передаваемые параметрами в хранимку я уже могу предсказать что там все будет криво (так как так делать не надо никогда это исключительно кривой дизай

хранимая процедура реализована на PL/SQL C++.
набор данных передать в функцию иначе нельзя.
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933167
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsychopcadviser,

или так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT * 
FROM 
(
  SELECT * 
  FROM road_addedges 
  UNION ALL 
  SELECT * 
  FROM road.edges
) AS graph
WHERE 
NOT EXISTS (
  SELECT 1 FROM road_deledges AS rd WHERE rd.gid = graph.id
) AND
NOT EXISTS (
  SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.source
) AND
NOT EXISTS (
  SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.target
)



вот результат

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
explain (ANALYZE, costs, buffers) 
SELECT paths.seq, edges.* FROM pgr_astar ('SELECT * FROM (SELECT * FROM road_addedges UNION ALL
SELECT * FROM road.edges) AS graph 
WHERE NOT EXISTS (SELECT 1 FROM road_deledges AS rd WHERE rd.gid = graph.id) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.source) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.target) 
AND NOT st_intersects(the_geom, geomfromewkt(''SRID=4326;POLYGON((53 52,51 56,55 56,53 52))'')) ',
7000528, 7000530, false, false) AS paths, (SELECT * FROM road_addedges UNION ALL SELECT * FROM road.edges) AS edges 
WHERE paths.id2 = edges.id 
ORDER BY seq;



результат - время возрасло

Sort (cost=15564684.21..15674965.05 rows=44112335 width=498) (actual time=30923.256..30923.603 rows=6663 loops=1)
Sort Key: paths.seq
Sort Method: quicksort Memory: 2678kB
Buffers: shared hit=50018 read=728460, local hit=6670
-> Nested Loop (cost=0.00..12468.32 rows=44112335 width=498) (actual time=30894.333..30920.352 rows=6663 loops=1)
Join Filter: (paths.id2 = road_addedges.id)
Buffers: shared hit=50018 read=728460, local hit=6670
-> Function Scan on pgr_astar paths (cost=0.00..10.00 rows=1000 width=8) (actual time=30894.308..30894.946 rows=6664 loops=1)
Buffers: shared hit=23299 read=728460, local hit=2
-> Append (cost=0.00..12.43 rows=2 width=323) (actual time=0.003..0.003 rows=1 loops=6664)
Buffers: shared hit=26719, local hit=6668
-> Index Scan using edges_gid_idx on road_addedges (cost=0.00..0.32 rows=1 width=152) (actual time=0.000..0.000 rows=0 loops=6664)
Index Cond: (road_addedges.id = paths.id2)
Buffers: local hit=6668
-> Index Scan using edges_gid_idx on edges (cost=0.00..12.12 rows=1 width=494) (actual time=0.003..0.003 rows=1 loops=6664)
Index Cond: (road.edges.id = paths.id2)
Buffers: shared hit=26719
Total runtime: 30923.946 ms
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933181
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsychopcadviser,

попробуйте

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT * 
FROM 
(
  SELECT * 
  FROM road_addedges 
  UNION ALL 
  SELECT * 
  FROM road.edges
) AS graph 
LEFT JOIN
road_deledges AS rd
ON graph.id = rd.gid
LEFT JOIN
road_delnodes AS rdns
ON source = rdns.gid
LEFT JOIN
road_delnodes AS rdnt
ON target = rdnt.gid
WHERE 
  rd.gid IS NULL AND
  rdns.gid IS NULL AND
  rdnt.gid IS NULL



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
explain (ANALYZE, costs, buffers) 
SELECT paths.seq, edges.* FROM pgr_astar ('SELECT * FROM (SELECT * FROM road_addedges UNION ALL SELECT * FROM road.edges) AS graph 
LEFT JOIN road_deledges AS rd ON graph.id = rd.gid 
LEFT JOIN road_delnodes AS rdns ON graph.source = rdns.gid 
LEFT JOIN road_delnodes AS rdnt ON graph.target = rdnt.gid 
WHERE  rd.gid IS NULL AND rdns.gid IS NULL AND rdnt.gid IS NULL AND 
NOT st_intersects(the_geom, geomfromewkt(''SRID=4326;POLYGON((53 52,51 56,55 56,53 52))'')) ',
7000528, 7000530, false, false) AS paths,
(SELECT * FROM road_addedges UNION ALL SELECT * FROM road.edges) AS edges
WHERE paths.id2 = edges.id 
ORDER BY seq;



результат - время тоже увеличилось

Sort (cost=15564684.21..15674965.05 rows=44112335 width=498) (actual time=31767.105..31767.519 rows=6663 loops=1)
Sort Key: paths.seq
Sort Method: quicksort Memory: 2678kB
Buffers: shared hit=50103 read=728364, local hit=6670
-> Nested Loop (cost=0.00..12468.32 rows=44112335 width=498) (actual time=31736.068..31763.964 rows=6663 loops=1)
Join Filter: (paths.id2 = road_addedges.id)
Buffers: shared hit=50103 read=728364, local hit=6670
-> Function Scan on pgr_astar paths (cost=0.00..10.00 rows=1000 width=8) (actual time=31736.042..31736.635 rows=6664 loops=1)
Buffers: shared hit=23384 read=728364, local hit=2
-> Append (cost=0.00..12.43 rows=2 width=323) (actual time=0.003..0.003 rows=1 loops=6664)
Buffers: shared hit=26719, local hit=6668
-> Index Scan using edges_gid_idx on road_addedges (cost=0.00..0.32 rows=1 width=152) (actual time=0.000..0.000 rows=0 loops=6664)
Index Cond: (road_addedges.id = paths.id2)
Buffers: local hit=6668
-> Index Scan using edges_gid_idx on edges (cost=0.00..12.12 rows=1 width=494) (actual time=0.003..0.003 rows=1 loops=6664)
Index Cond: (road.edges.id = paths.id2)
Buffers: shared hit=26719

Total runtime: 31767.863 ms
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933192
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из общих соображений -- вы туда через sql передаёте его возврат
т.е. оно там, унутре, исполняется "как есть"
а потом над возвратом измывается сишным кодом.

т.е. дайте план вот такого:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT * FROM (SELECT * FROM road_addedges UNION ALL
SELECT * FROM road.edges) AS graph 
WHERE NOT EXISTS (SELECT 1 FROM road_deledges AS rd WHERE rd.gid = graph.id) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.source) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.target) 
AND NOT st_intersects(the_geom, geomfromewkt('SRID=4326;POLYGON((53 52,51 56,55 56,53 52))')) 


есть ли gist индексы по the_geom ?
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933200
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqиз общих соображений -- вы туда через sql передаёте его возврат
т.е. оно там, унутре, исполняется "как есть"
а потом над возвратом измывается сишным кодом.

т.е. дайте план вот такого:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT * FROM (SELECT * FROM road_addedges UNION ALL
SELECT * FROM road.edges) AS graph 
WHERE NOT EXISTS (SELECT 1 FROM road_deledges AS rd WHERE rd.gid = graph.id) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.source) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.target) 
AND NOT st_intersects(the_geom, geomfromewkt('SRID=4326;POLYGON((53 52,51 56,55 56,53 52))')) 



есть ли gist индексы по the_geom ?

индексы есть и по the_geom, id, gid, source, target

с применением NOT EXISTS, тоже пробывал
результат - хуже

результат - в теме, чуть выше
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933205
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pcadviserqwwqиз общих соображений -- вы туда через sql передаёте его возврат
т.е. оно там, унутре, исполняется "как есть"
а потом над возвратом измывается сишным кодом.

т.е. дайте план вот такого:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT * FROM (SELECT * FROM road_addedges UNION ALL
SELECT * FROM road.edges) AS graph 
WHERE NOT EXISTS (SELECT 1 FROM road_deledges AS rd WHERE rd.gid = graph.id) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.source) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.target) 
AND NOT st_intersects(the_geom, geomfromewkt('SRID=4326;POLYGON((53 52,51 56,55 56,53 52))')) 



есть ли gist индексы по the_geom ?

индексы есть и по the_geom, id, gid, source, target

с применением NOT EXISTS, тоже пробывал
результат - хуже

результат - в теме, чуть выше
гне надо пробЫвать, пробудете так всё на свете

надо сделать что просят, если лень читать
-- я вытащил наружу передаваемую в C динамику -- и прошу план по ней, а не по внешнему запросу
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933207
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, и втащите WHERE руками в части UNION ALL-а -- оно конечно планер должен это уметь, но писать изначально верно -- не повредит.
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933208
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. как велик перечень ключей (source,target), по условиям


Код: sql
1.
2.
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.source) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.target)


--исчислим ли этот набор (или его срезы) снаружи (т.е. охвачено ли всё fk-ями) ?
-- если исчислим, и ожидаемо мал -- нельзя ли инвертировать NOT IN () в "=ANY(ARRAY(SELECT f_keys FROM blahblah EXCEPT ... FROM road_delnodes.))" ?
-- если можно -- то нет ли возможности составной btree_gist индекс поюзать ?
...
Рейтинг: 0 / 0
оптимизация запроса
    #38933242
pcadviser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqpcadviserпропущено...


индексы есть и по the_geom, id, gid, source, target

с применением NOT EXISTS, тоже пробывал
результат - хуже

результат - в теме, чуть выше
гне надо пробЫвать, пробудете так всё на свете

надо сделать что просят, если лень читать
-- я вытащил наружу передаваемую в C динамику -- и прошу план по ней, а не по внешнему запросу

не понял Вашу мысль сразу, вот

Код: sql
1.
2.
3.
4.
5.
6.
7.
explain (ANALYZE, costs, buffers) 
SELECT * FROM (SELECT * FROM road_addedges UNION ALL 
SELECT * FROM road.edges) AS graph 
WHERE NOT EXISTS (SELECT 1 FROM road_deledges AS rd WHERE rd.gid = graph.id) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.source) 
AND NOT EXISTS ( SELECT 1 FROM road_delnodes AS rdn WHERE rdn.gid = graph.target) 
AND NOT st_intersects(the_geom, geomfromewkt('SRID=4326;POLYGON((53 52,51 56,55 56,53 52))')) 



Nested Loop Anti Join (cost=64.00..3495310.19 rows=1 width=494) (actual time=0.016..13064.774 rows=8746687 loops=1)
Join Filter: (rdn.gid = road_addedges.target)
Buffers: shared hit=23563 read=728172, local hit=2
-> Nested Loop Anti Join (cost=64.00..3495271.57 rows=1 width=494) (actual time=0.015..9713.446 rows=8746687 loops=1)
Join Filter: (rdn.gid = road_addedges.source)
Buffers: shared hit=23563 read=728172, local hit=2
-> Hash Anti Join (cost=64.00..3495232.96 rows=1 width=494) (actual time=0.014..6385.614 rows=8746687 loops=1)
Hash Cond: (road_addedges.id = rd.gid)
Buffers: shared hit=23563 read=728172, local hit=2
-> Append (cost=0.00..3066717.59 rows=8788746 width=494) (actual time=0.006..4877.485 rows=8746689 loops=1)
Buffers: shared hit=23563 read=728172, local hit=1
-> Seq Scan on road_addedges (cost=0.00..125.50 rows=440 width=152) (actual time=0.005..0.007 rows=6 loops=1)
Filter: ((NOT (the_geom && '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry))
OR (NOT _st_intersects(the_geom, '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry)))
Buffers: local hit=1
-> Seq Scan on edges (cost=0.00..3066592.09 rows=8788306 width=494) (actual time=0.004..4187.377 rows=8746683 loops=1)
Filter: ((NOT (the_geom && '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry))
OR (NOT _st_intersects(the_geom, '0103000020E610000001000000040000000000000000804A400000000000004A4000000000008049400000000000004C400000000000804B400000000000004C400000000000804A400000000000004A40'::geometry)))
Buffers: shared hit=23563 read=728172
-> Hash (cost=34.00..34.00 rows=2400 width=4) (actual time=0.003..0.003 rows=2 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 1kB
Buffers: local hit=1
-> Seq Scan on road_deledges rd (cost=0.00..34.00 rows=2400 width=4) (actual time=0.001..0.001 rows=2 loops=1)
Buffers: local hit=1
-> Seq Scan on road_delnodes rdn (cost=0.00..34.00 rows=2400 width=4) (actual time=0.000..0.000 rows=0 loops=8746687)
-> Seq Scan on road_delnodes rdn (cost=0.00..34.00 rows=2400 width=4) (actual time=0.000..0.000 rows=0 loops=8746687)

Total runtime: 13494.066 ms
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 2 из 3
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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