ST_Інтерсекційний повільний запит


11

Я намагаюся провести перехрестя між двома шарами:

  1. Полілінійний шар, що представляє деякі дороги (~ 5500 рядків)
  2. Шар багатокутника, що представляє буфери неправильної форми навколо різних точок інтересу (~ 47 000 рядків)

Зрештою, те, що я намагаюся зробити, це підключити полілінії до цих багатьох (іноді перекриваються) буферів, а потім підсумувати загальну довжину проїжджої частини, що міститься у кожному буфері.

Проблема полягає в тому, що все працює повільно. Я не впевнений, скільки часу це має зайняти, але я просто перервав запит через> 34 години. Я сподіваюся, що хтось може або вказати, де я помилився зі своїм SQL-запитом, або може вказати на кращий спосіб зробити це.

CREATE TABLE clip_roads AS

SELECT 
  ST_Intersection(b.the_geom, z.the_geom) AS clip_geom,
  b.*

FROM 
  public."roads" b, 
  public."buffer1KM" z

WHERE ST_Intersects(b.the_geom, z.the_geom);


CREATE INDEX "clip_roads_clip_geom_gist"
  ON "clip_roads"
  USING gist
  (clip_geom);



CREATE TABLE buffer1km_join AS

SELECT
  z.name, z.the_geom,
  sum(ST_Length(b.clip_geom)) AS sum_length_m

FROM
  public."clip_roads" b,
  public."buffer1KM" z

WHERE
  ST_Contains(z.the_geom, b.the_geom)

GROUP BY z.name, z.the_geom;

У мене є індекс GiST, створений для оригінальної таблиці доріг, і (тільки щоб бути безпечним?) Створити індекс, перш ніж робити другу таблицю.

План запитів від PGAdmin III виглядає приблизно так, хоча я боюся, що я не маю особливих навичок його інтерпретувати:

"Nested Loop  (cost=0.00..29169.98 rows=35129 width=49364)"
"  Output: st_intersection(b.the_geom, z.the_geom), b.gid, b.geo_id, b.address_l, b.address_r, b.lf_name, b.lfn_id, b.lfn_name, b.lfn_type_c, b.lfn_type_d, b.lfn_dir_co, b.lfn_dir_de, b.lfn_desc, b.oe_flag_l, b.oe_flag_r, b.fcode_desc, b.fcode, b.fnode, b.tnode, b.metrd_num, b.lo_num_l, b.lo_n_suf_l, b.hi_num_l, b.hi_n_suf_l, b.lo_num_r, b.lo_n_suf_r, b.hi_num_r, b.hi_n_suf_r, b.juris_code, b.dir_code, b.dir_code_d, b.cp_type, b.length, b.the_geom"
"  Join Filter: _st_intersects(b.the_geom, z.the_geom)"
"  ->  Seq Scan on public."roads" b  (cost=0.00..306.72 rows=5472 width=918)"
"        Output: b.gid, b.geo_id, b.address_l, b.address_r, b.lf_name, b.lfn_id, b.lfn_name, b.lfn_type_c, b.lfn_type_d, b.lfn_dir_co, b.lfn_dir_de, b.lfn_desc, b.oe_flag_l, b.oe_flag_r, b.fcode_desc, b.fcode, b.fnode, b.tnode, b.metrd_num, b.lo_num_l, b.lo_n_suf_l, b.hi_num_l, b.hi_n_suf_l, b.lo_num_r, b.lo_n_suf_r, b.hi_num_r, b.hi_n_suf_r, b.juris_code, b.dir_code, b.dir_code_d, b.cp_type, b.length, b.the_geom"
"  ->  Index Scan using "buffer1KM_index_the_geom" on public."buffer1KM" z  (cost=0.00..3.41 rows=1 width=48446)"
"        Output: z.gid, z.objectid, z.facilityid, z.name, z.frombreak, z.tobreak, z.postal_cod, z.pc_area, z.ct_id, z.da_id, z.taz_id, z.edge_poly, z.cchs_0708, z.tts_06, z.the_geom"
"        Index Cond: (b.the_geom && z.the_geom)"

Невже ця операція приречена на кілька днів? Зараз я працюю на PostGIS для Windows, але теоретично я міг би кинути більше обладнання на цю проблему, поставивши її на Amazon EC2. Однак я бачу, що запит використовує лише одне ядро ​​за один раз (чи є спосіб змусити його використовувати більше?).


На чому працює Postgis? ОС і процесор можуть бути фактором.
Mapperz

Привіт Mapperz: ОС - це Windows 7, процесор - Core 2 Duo, об'єм пам'яті - 4 Гб (це Windows, працює 32-бітний PGSQL / PostGIS)
Пітер

Відповіді:


6

Петро,

Яку версію PostGIS, GEOS та PostgreSQL ви використовуєте?
робити

ВИБІР postgis_full_version (), версія ();

Для цього було досягнуто багато покращень між 1.4 та 1.5 та GEOS 3.2+.

Також скільки вершин мають у вас багатокутники?

Зробіть a

SELECT Max (ST_NPoints (the_geom)) As maxp FROM sometable;

Щоб зрозуміти свій найгірший сценарій. Така повільна швидкість часто обумовлена ​​геометріями, які надто остаточно зернисті. У цьому випадку ви можете спершу спростити.

Ви також зробили оптимізацію для свого файла postgresql.conf?


Привіт LR1234567: "POSTGIS =" 1.5.2 "GEOS =" 3.2.2-CAPI-1.6.2 "PROJ =" Відн. 4.6.1, 21 серпня 2008 р. "LIBXML =" 2.7.6 "USE_STATS"; "PostgreSQL 9.0.3, складений Visual C ++ build 1500, 32-розрядний" (запущений інший запит зараз)
Peter

Запит Max пробіг швидше, ніж я очікував: maxp = 2030 Я підозрюю, що це досить дрібнозернистий?
Пітер

1
2030 насправді не поганий. Можливо, у вас просто багато полігонів, які перетинаються. Взагалі перетин - це та частина, яка є найповільнішою. ​​Спробуйте зробити підрахунок, скільки записів насправді перетинаються - це може бути величезно.
LR1234567

ВИБІР підрахунку (*) ВІД загальнодоступних. "Дороги" b, громадські. "Буфер1КМ" z ДЕ СТ_Інтерсекти (b.the_geom, z.the_geom);
LR1234567

1
Чи величезна 910,978? Це приємна річ у тому, щоб почати нову техніку - у мене немає нормативних очікувань :-)
Пітер

1

корисна відповідь обміну стеками: /programming/1162206/why-is-postgresql-so-slow-on-windows

Налаштування постгресів: http://wiki.postgresql.org/wiki/Performance_Optimization

з досвіду рекомендую VACUUM ANALYZE


Дякую, це звучить як добра порада. Деякі проблеми з Windows, такі як штраф fork (), тут не повинні бути проблемою, оскільки я працюю в одному з'єднанні, правда? Також запустили VACUUM ANALYZE. Я ще не вникав у оптимізацію продуктивності.
Пітер

1
shared_buffers і work_mem зазвичай мають найбільше значення. Що стосується shared_buffers, ви трохи обмежені, наскільки ви можете це зробити на Windows, ніж ви на Linux
LR1234567

shared_buffers вже ввімкнено, але робота_mem вимкнено. Зараз я додав 1 Гб робочої пам’яті.
Пітер

1

Безсоромний штекер :) Може допомогти прочитати розділ 8 та 9 нашої книги. Просто гаряче віджимає преси. Ми висвітлюємо багато таких питань у цих розділах.

http://www.postgis.us/chapter_08

http://www.postgis.us/chapter_09


Посилання порушені, це стосується PostGIS в дії або кулінарної книги PostGIS?
HeikkiVesanto

1
ах ви праві. Це були посилання на перше видання PostGIS в дії - які діяли тоді. Коли ми представили друге видання, нам довелося змінити структуру посилань. Старі посилання, на які йдеться, зараз тут: postgis.us/chapters_edition_1
LR1234567

0

Дивіться дві поради щодо оптимізації просторового запиту. Вони дуже добре працюють на мене. http://kb.zillionics.com/optimize-spatial-query/


2
Ця відповідь буде краще детальніше, наприклад, як застосувати їх у цьому конкретному сценарії.
BradHards
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.