Почему мой экземпляр Postgresql не использует сканирование растровых индексов? - PullRequest
0 голосов
/ 18 октября 2018

У меня запущено два экземпляра Postgresql: один на моей локальной машине с версией 10.5, а другой на моей рабочей машине с версией 9.5.10.Я создаю таблицы на своем локальном компьютере и перемещаю их на рабочий компьютер, используя pg_dump и pr_restore.Когда я запускаю следующую команду на моем локальном компьютере, это занимает около 100 мсек:

CREATE TABLE test_point AS
    SELECT a.*, b.*, a.total_score + b.total_score_table_2 AS total_score_all
    FROM master_enigma_table_designations b,
      ST_Transform(ST_SetSRID(ST_Makepoint(-408601.4826183041,6707237.695265564), 3857), 27700) dropped_pin LEFT JOIN
    master_enigma_table a
    ON ST_Within(dropped_pin, a.wkb_geometry)
    WHERE a.poly_id = b.poly_id_new;

, а когда я запускаю EXPLAIN ANALYZE, я получаю следующий вывод:

"Nested Loop  (cost=1119.13..180619.12 rows=9594 width=4224) (actual time=0.157..0.225 rows=1 loops=1)"
"  Buffers: shared hit=22"
"  ->  Nested Loop  (cost=1118.69..118339.83 rows=9594 width=2444) (actual time=0.126..0.189 rows=1 loops=1)"
"        Buffers: shared hit=18"
"        ->  Function Scan on dropped_pin  (cost=0.00..0.01 rows=1 width=32) (actual time=0.004..0.006 rows=1 loops=1)"
"        ->  Bitmap Heap Scan on master_enigma_table a  (cost=1118.69..118243.88 rows=9594 width=2444) (actual time=0.108..0.167 rows=1 loops=1)"
"              Recheck Cond: (wkb_geometry ~ dropped_pin.dropped_pin)"
"              Filter: _st_contains(wkb_geometry, dropped_pin.dropped_pin)"
"              Rows Removed by Filter: 2"
"              Heap Blocks: exact=3"
"              Buffers: shared hit=18"
"              ->  Bitmap Index Scan on master_enigma_table_gist_index  (cost=0.00..1116.29 rows=28783 width=0) (actual time=0.089..0.090 rows=3 loops=1)"
"                    Index Cond: (wkb_geometry ~ dropped_pin.dropped_pin)"
"                    Buffers: shared hit=8"
"  ->  Index Scan using master_enigma_table_designations_poly_id on master_enigma_table_designations b  (cost=0.44..6.48 rows=1 width=1772) (actual time=0.021..0.024 rows=1 loops=1)"
"        Index Cond: (poly_id_new = a.poly_id)"
"        Buffers: shared hit=4"
"Planning time: 1.397 ms"
"Execution time: 10.058 ms"

Когда я запускаюТочно такой же запрос на моей производственной машине занимает 8 минут.Когда я запускаю EXPLAIN ANALYZE, я получаю:

"Nested Loop  (cost=0.44..15399024.56 rows=9594 width=4208) (actual time=326842.620..478541.379 rows=1 loops=1)"
"  Buffers: shared hit=1314092 read=6890152"
"  ->  Nested Loop  (cost=0.00..15323938.18 rows=9594 width=2425) (actual time=326842.576..478541.332 rows=1 loops=1)"
"        Join Filter: ((a.wkb_geometry ~ dropped_pin.dropped_pin) AND _st_contains(a.wkb_geometry, dropped_pin.dropped_pin))"
"        Rows Removed by Join Filter: 28783093"
"        Buffers: shared hit=1314088 read=6890152"
"        ->  Function Scan on dropped_pin  (cost=0.00..0.01 rows=1 width=32) (actual time=0.003..0.004 rows=1 loops=1)"
"        ->  Seq Scan on master_enigma_table a  (cost=0.00..7768445.30 rows=28782830 width=2425) (actual time=0.018..458071.770 rows=28783094 loops=1)"
"              Buffers: shared hit=590465 read=6890152"
"  ->  Index Scan using master_enigma_table_designations_new_poly_id on master_enigma_table_designations b  (cost=0.44..7.81 rows=1 width=1783) (actual time=0.012..0.013 rows=1 loops=1)"
"        Index Cond: (poly_id_new = a.poly_id)"
"        Buffers: shared hit=4"
"Planning time: 26.628 ms"
"Execution time: 478582.199 ms"

Похоже, что мой рабочий компьютер не использует растровое индексное сканирование, а мой локальный компьютер -.Оба экземпляра имеют одинаковые таблицы, индексы, и я запустил ANALYZE для всех таблиц.Я запустил SHOW ALL, и растровое сканирование тоже включено.

Есть ли у кого-нибудь какие-либо предложения относительно того, что я могу сделать, чтобы решить мою проблему.

1 Ответ

0 голосов
/ 18 октября 2018

Другая версия Postgres означает, что вы также используете другую версию PostGIS.Старая версия с 9.5 не использует индекс для функции st_within ().В 9.5 вы должны добавить st_dwithin (drop_pin, a.wkb_geometry, 0) для использования индексированных значений.

CREATE TABLE test_point AS
SELECT a.*, b.*, a.total_score + b.total_score_table_2 AS total_score_all
  FROM master_enigma_table_designations b,
       ST_Transform(ST_SetSRID(ST_Makepoint(-408601.4826183041,6707237.695265564), 3857), 27700) dropped_pin 
  LEFT JOIN master_enigma_table a ON ST_Within(dropped_pin, a.wkb_geometry)
                                  and ST_DWithin(dropped_pin, a.wkb_geometry,0)
WHERE a.poly_id = b.poly_id_new;

Простой совет - используйте одну и ту же версию Postgres и PostGIS на обеих машинах, или вы получите большетакие проблемы несовместимости.

...