OpenStreetMap PostGIS क्वेरी को गति देना


12

मेरे पास ओस्मोसिस स्कीमा का उपयोग करके नीदरलैंड के लिए पोस्टग्रिज डेटाबेस (PostgreSQL 8.3 / PostGIS 1.3.3) में लोड किए गए OpenStreetMap डेटा है । इसका मतलब यह है कि सभी टैग एक स्टोर फ़ील्ड में संग्रहीत हैं । जीआईएसटी सूचकांक के अलावा जो ऑस्मोसिस ज्यामिति क्षेत्र पर बनाता है, मैंने टैग क्षेत्र पर एक अतिरिक्त जीआईएसटी सूचकांक बनाया।

टैग क्षेत्र पर एक स्थानिक बाधा और एक बाधा दोनों का उपयोग करके क्वेरी करने की कोशिश कर रहा हूं, मुझे लगता है कि यह मेरी तुलना में धीमी है। इस तरह एक क्वेरी:

SELECT n.geom,n.tags,n.tstamp,u.name FROM nodes AS n 
  INNER JOIN users AS u ON n.user_id = u.id 
  WHERE tags->'man_made'='surveillance' 
  AND ST_Within(geom, ST_GeomFromText('POLYGON((4.0 52.0,5.0 52.0,5.0 53.0,4.0 53.0,4.0 52.0))',4326));

78 रिकॉर्ड वापस करने के लिए 22 सेकंड लगते हैं।

इस तालिका में लगभग 53 मिलियन रिकॉर्ड हैं।

क्या इसको गति देने का एक तरीका है? मैंने सुना है कि PostgreSQL 9 में hstore को काफी बेहतर तरीके से लागू किया गया है, क्या यह मदद को उन्नत करेगा?


चूंकि यह एक डेटाबेस उन्मुख प्रश्न प्रतीत होता है, मैं आपको dba.stackexchange.com
jcolebrand

2015 के लिए अपडेट - इस सवाल के पूछे जाने के बाद से PostGIS ने महत्वपूर्ण प्रदर्शन में सुधार किया है, इसलिए इस बात पर विचार करें कि पोस्टग्रेएसक्यूएल अपग्रेड भी है।
टोबी स्पाइट

जवाबों:


5

एक विधि उन टैगों के लिए क्वेरी करने के लिए होगी, जो आप में रुचि रखते हैं और उन रिकॉर्डों को एक नई तालिका में रखते हैं। फिर आपको केवल सभी 53 मिलियन रिकॉर्ड्स के बजाय नई तालिका को क्वेरी करने की आवश्यकता होगी। यदि आप अपने डेटाबेस को अपडेट रखने की कोशिश कर रहे हैं, तो आप ओएसएम से नया डेटा प्राप्त करने पर हर बार यह क्वेरी चला सकते हैं।


2
नई तालिका बनाने के बजाय, आप इसके बजाय एक दृश्य बनाने पर विचार कर सकते हैं, इस तरह आप "क्वेरी" डेटा के शाब्दिक दोहराव के बिना अपने मूल स्रोत डेटा से जुड़े रहते हैं।
रयानकैल्टन

7
एक दृश्य जरूरी नहीं कि क्वेरी प्रदर्शन में सुधार हो, जब तक कि यह एक भौतिक दृष्टिकोण या समकक्ष ( इस विषय पर एसओ प्रश्न देखें ) नहीं है। मुझे विश्वास नहीं है कि पोस्टग्रैक्स्ल सीधे भौतिक विचारों का समर्थन करता है , लेकिन उन्हें ट्रिगर्स का उपयोग करके लागू किया जा सकता है।
एडम आर्मर

2
यह वर्तमान में मैं जिस वर्कअराउंड का उपयोग कर रहा हूं। ऑस्मोसिस टेबल्स के अपडेट के बाद, मैं उन कुछ टेबलों को फिर से बनाता हूं जो उन प्रश्नों के लिए अनुकूलित हैं जिन्हें मैं चलाना चाहता हूं। मुझे लगता है कि बेहतर तरीका होना चाहिए। ट्रिगर्स का विषय मुझे साज़िश करता है, और आप उन्हें भौतिक विचारों को लागू करने के लिए कैसे उपयोग कर सकते हैं। @ एडम कवच, कोई भी मौका जिससे आप इस बारे में कुछ जानकारी साझा कर सकें?
एमवेक्सेल

4
@mvexel इस विकी लेख पर एक नज़र डालें , जो कि भौतिक विचारों और विवरणों की मूल बातें शामिल करता है कि उन्हें पोस्टगॉल्ड SQL में कैसे लागू किया जाए।
एडम आर्मर

5

आप अपने horeore कॉलम के लिए एक इंडेक्स बनाने की कोशिश कर सकते हैं,

CREATE INDEX nodes_tags_idx ON nodes USING GIST(tags)

और फिर ?उस पंक्तियों को क्वेरी को सीमित करने के लिए ऑपरेटर का उपयोग करें :

SELECT n.geom,n.tags,n.tstamp,u.name FROM nodes AS n 
  INNER JOIN users AS u ON n.user_id = u.id 
  WHERE tags ? 'man_made'
  AND tags->'man_made'='surveillance' 
  AND ST_Within(geom, ST_GeomFromText('POLYGON((4.0 52.0,5.0 52.0,5.0 53.0,4.0 53.0,4.0 52.0))',4326));

धन्यवाद! मैंने वह इंडेक्स पहले ही बना लिया था, केवल मैं उसका उपयोग नहीं कर रहा था। यह केवल कुछ कार्यों को गति देता है। PostgreSQL 8.3 में (जो मैं उपयोग कर रहा हूं) यह केवल @> और है? , 9.0 में यह @>?;?; और? |
मावेक्सेल

1
रिकॉर्ड के लिए, ?ऑपरेटर का उपयोग करने वाली क्वेरी ने मेरी क्वेरी के लिए 88 सेकंड की तुलना में 48 सेकंड का समय लिया (मुझे नहीं पता कि मुझे कल 72 सेकंड कैसे मिले, हो सकता है कि मशीन इस बार कुछ जटिल कर रही थी जब मैंने प्रश्नों का प्रदर्शन किया था)। इसलिए अभी भी वह प्रदर्शन नहीं है जिसकी मैं तलाश कर रहा हूं, लेकिन मुझे इस बात की गहरी समझ है कि HISTore कॉलम पर GIST इंडेक्स कैसे काम करते हैं। मुझे अभी भी प्रदर्शन को प्राप्त करने के लिए एक भौतिकवादी दृश्य बनाने के दूसरे समाधान के साथ जाना होगा।
मावेक्सेल

3

St_within और _st_within फ़ंक्शंस उनकी गति के लिए ज्ञात नहीं हैं। && ऑपरेटर मदद कर सकता है क्योंकि यह ज्यामिति के बजाय बॉक्स की जांच करेगा

आप निम्नलिखित की कोशिश कर सकते हैं:

SELECT n.geom,n.tags,n.tstamp,u.name FROM nodes AS n 
  INNER JOIN users AS u ON n.user_id = u.id 
  WHERE tags ? 'man_made'
  AND tags->'man_made'='surveillance' 
  AND geom && ST_SetSRID('BOX3D(4 52,5 53)'::box3d,4326);

अधिक प्रदर्शन युक्तियों के लिए जाँच करें: http://postgis.refractions.net/docs/ch06.html


2

आपकी क्वेरी की समस्या tags->'man_made'='surveillance'खंड है। यह बलों को टैग की दुकान का विस्तार करने के लिए स्थगित करता है और इसे सूचकांक का उपयोग करने की अनुमति नहीं देता है। यदि आप इसका उपयोग करते हुए @>इसे फिर से लिखते हैं (इसमें) यह सूचकांक उपयोग की अनुमति देगा।

क्योंकि आप एक आयत को क्वेरी कर रहे हैं, आप &&ST_Within के बजाय उपयोग कर सकते हैं । यह एक छोटा सा लाभ होगा, क्योंकि ST_Within मूल्यांकन करने के लिए जटिल नहीं है, और ST_Within स्पष्ट रूप से एक &&चेक करता है ।

एक अतिरिक्त गति वृद्धि GIST अनुक्रमणिका के बजाय टैग पर GIN अनुक्रमणिका का उपयोग करने के लिए होगी। जीआईएन इंडेक्स को बनाने में अधिक समय लगता है लेकिन तेज होता है।

पूरी क्वेरी होगी

SELECT n.geom,n.tags,n.tstamp,u.name FROM nodes AS n INNER JOIN users AS u ON n.user_id = u.id WHERE tags @> hstore('man_made', 'surveillance') AND geom && ST_GeomFromText('POLYGON((4.0 52.0,5.0 52.0,5.0 53.0,4.0 53.0,4.0 52.0))',4326);

यदि आप जानते हैं कि आप किसी विशेष टैग को क्वेरी करने जा रहे हैं, तो आप उस पर एक आंशिक सूचकांक बना सकते हैं CREATE INDEX ON nodes ( tags->'man_made' ) WHERE (tags->'man_made' IS NOT NULL);

यह WHERE की स्थिति tags->'man_made'='surveillance'को सूचकांक का उपयोग करने की अनुमति देगा । दुर्भाग्यवश, वह सूचकांक @>प्रश्नों की मदद नहीं कर सकता है और GIN या GIST अनुक्रमित tags->'foo'प्रश्नों की मदद नहीं कर सकता है , इसलिए आपको प्रश्नों को उन अनुक्रमणिकाओं से मिलान करना होगा जो आपके पास हैं।


tags @>hstore()बड़े पैमाने पर उपयोग करने की सलाह ने मेरी क्वेरी में सुधार किया, धन्यवाद।
अल्फाबेटसैप

1

इसके बजाय यह प्रयास करें:

N.geom, n.tstamp, n.tstamp, u.name से नोड्स का चयन करें n n INNER के रूप में उपयोगकर्ताओं को शामिल करें, n.user_id = u.id पर टैग के रूप में @> 'man_made => निगरानी = # hstore और ST_Within (geom) , ST_GeomFromText ('पोलीगॉन ((4.0 52.0,5.0 52.0,5.0 53.0,4.0 53.0,4.0 52.0))', 4326);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.