ST_Intersection धीमी क्वेरी


11

मैं दो परतों के बीच एक चौराहा प्रदर्शन करने की कोशिश कर रहा हूँ:

  1. कुछ सड़कों का प्रतिनिधित्व करने वाली पॉलीलाइन परत (~ 5500 पंक्तियाँ)
  2. बहुभुज परत ब्याज के विभिन्न बिंदुओं के आसपास अनियमित आकार के बफ़र्स का प्रतिनिधित्व करती है (~ 47,000 पंक्तियाँ)

अंततः, मैं जो करने की कोशिश कर रहा हूं, वह इन कई (कभी-कभी अतिव्यापी) बफ़र को पॉलीइन्स को क्लिप करना है, और फिर प्रत्येक बफ़र के भीतर निहित रोडवे की कुल लंबाई को योग करना है।

समस्या यह है कि चीजें धीमी गति से चल रही हैं। मुझे यकीन नहीं है कि यह कितना समय लेना चाहिए, लेकिन मैंने सिर्फ> 34 घंटे के बाद अपनी क्वेरी निरस्त कर दी। मैं उम्मीद कर रहा हूं कि कोई व्यक्ति या तो यह इंगित कर सकता है कि मैंने अपनी एसक्यूएल क्वेरी के साथ कुछ गलती की है, या मुझे ऐसा करने के बेहतर तरीके से इंगित कर सकता है।

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 पर इसे चला रहा हूं, लेकिन मैं सैद्धांतिक रूप से अमेज़न EC2 पर इसे डालकर समस्या पर अधिक हार्डवेयर फेंक सकता हूं। हालाँकि, मैं देख रहा हूँ कि क्वेरी केवल एक समय में एक कोर का उपयोग कर रही है (क्या इसका अधिक उपयोग करने का कोई तरीका है?)।


पोस्टगिस किस पर चल रहा है? OS और प्रोसेसर एक कारक हो सकता है।
Mapperz

हाय मैपरेज़: ओएस विंडोज 7 है, सीपीयू कोर 2 डुओ है, मेमोरी 4 जीबी है (विंडोज होने के नाते, 32-बिट पीजीएसक्यूएल / पोस्टजीआईएस चला रहा है)
पीटर

जवाबों:


6

पीटर,

PostGIS, GEOS और PostgreSQL का कौन सा संस्करण आप उपयोग कर रहे हैं?
करो ए

चुनें पोस्टगिस_फुल_वर्जन (), संस्करण ();

इस तरह की चीज़ों के लिए 1.4 और 1.5 और GEOS 3.2+ के बीच बहुत सारी वृद्धि की गई है।

यह भी कि आपके पॉलीगॉन में कितने कोने हैं?

ए करें

चयन मैक्स (ST_NPoints (the_geom)) के रूप में कुछ से अधिकतम;

अपने सबसे खराब स्थिति के बारे में जानने के लिए। इस तरह की धीमी गति अक्सर ज्यामितीय कारणों से होती है जो अंत में बहुत दानेदार होते हैं। जिस स्थिति में आप पहले को सरल बनाना चाहते हैं।

क्या आपने अपनी पोस्टग्रैसक्ल्.कॉन्फ़ फ़ाइल के लिए अनुकूलन किया है?


हाय LR1234567: "POSTGIS =" 1.5.2 "GEOS =" 3.2.2-CAPI-1.6.2 "PROJ =" Rel। 4.6.1, 21 अगस्त 2008 "LIBXML =" 2.7.6 "USE_STATS"; "पोस्टग्रेक्यूएल 9.0.3, विजुअल C ++ बिल्ड 1500, 32-बिट" द्वारा संकलित (अब अन्य क्वेरी चला रहा है)
पीटर

अधिकतम क्वेरी मेरी अपेक्षा से अधिक तेज़ी से चली: अधिकतम = 2030 मुझे संदेह है कि यह काफी बारीक है?
पीटर

1
2,030 वास्तव में बुरा नहीं है। यह हो सकता है कि आपके पास बहुत सारे बहुभुज हों जो प्रतिच्छेद करते हैं। आम तौर पर चौराहा वह हिस्सा होता है जो सबसे धीमा होता है .. इस बात की गिनती करने की कोशिश करें कि वास्तव में कितने रिकॉर्ड को काटना है - यह बहुत बड़ा हो सकता है।
LR1234567

सेलेक्ट काउंट (*) पब्लिक से। "सड़कों" b, public। "बफर 1 केएम" z WHERE ST_Intersects (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 चलाएं। मैंने अभी तक किसी भी प्रदर्शन अनुकूलन में नहीं खोदा है।
पीटर

1
share_buffers और work_mem आम तौर पर सबसे अधिक अंतर रखते हैं। Share_buffers के लिए आप थोड़े अधिक सीमित हैं कि आप खिड़कियों पर जितना हो सकता है, उससे अधिक आप
लाइनक्स

share_buffers पहले से ही चालू था, लेकिन work_mem बंद था। मैंने अभी 1 GB वर्क मेम जोड़ा है।
पीटर

1

बेशर्म प्लग :) हमारी पुस्तक के अध्याय 8 और अध्याय 9 को पढ़ने में मदद कर सकता है। बस प्रेस से गर्म। हम उन अध्यायों में इस तरह के बहुत सारे सवालों को कवर करते हैं।

http://www.postgis.us/chapter_08

http://www.postgis.us/chapter_09


लिंक टूट गए हैं, क्या यह पोस्टगिस इन एक्शन या पोस्टगिस कुकबुक का जिक्र है?
हिक्कीवेसंतो

1
आह तुम सही हो वे लड़ाई में PostGIS के पहले संस्करण के लिंक थे - जो तब तक मान्य थे। जब हमने दूसरा संस्करण पेश किया तो हमें लिंक संरचना को बदलना पड़ा। पुराने लिंक जिन्हें अब यहाँ भेजा गया है: postgis.us/chapters_edition_1
LR1234567

0

स्थानिक क्वेरी को अनुकूलित करने के लिए दो युक्तियां देखें। वे मेरे लिए बहुत अच्छा काम करते हैं। http://kb.zillionics.com/optimize-spatial-query/


2
यह उत्तर कुछ और विवरणों के साथ बेहतर होगा, जैसे कि उन्हें इस विशेष परिदृश्य में कैसे लागू किया जाए।
ब्रैडहार्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.