PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

निर्देशांक द्वारा क्वेरी बहुत अधिक समय लेती है - विकल्प अनुकूलित करने के लिए?

आप एक स्थानिक सूचकांक का उपयोग करने से बहुत बेहतर होंगे जो एक आर-पेड़ का उपयोग करता है (अनिवार्य रूप से एक द्वि-आयामी सूचकांक, जो अंतरिक्ष को बक्से में विभाजित करके संचालित होता है), और दो अलग-अलग अक्षांशों पर तुलना से कम से अधिक बेहतर प्रदर्शन करेगा। , इस तरह की क्वेरी पर लोन मान। हालांकि आपको पहले एक ज्यामिति प्रकार बनाने की आवश्यकता होगी, जिसे आप वर्तमान में उपयोग किए जा रहे अलग-अलग लेट/लोन जोड़े के बजाय अपनी क्वेरी में अनुक्रमित और उपयोग करते हैं।

निम्नलिखित एक ज्यामिति प्रकार बनाएगा, इसे पॉप्युलेट करेगा, और इसमें एक अनुक्रमणिका जोड़ देगा, यह सुनिश्चित करते हुए कि यह एक बिंदु है और अक्षांश/देशांतर में, जिसे EPSG:4326

के रूप में जाना जाता है।
alter table event add column geom geometry(POINT, 4326);
update event set geom=ST_SetSrid(ST_MakePoint(lon, lat), 4326);
create index ix_spatial_event_geom on event using gist(geom);

फिर आप अपने ईवेंट प्राप्त करने के लिए निम्न क्वेरी चला सकते हैं, जो एक स्थानिक चौराहों का उपयोग करेगा, जो आपके स्थानिक सूचकांक का उपयोग करना चाहिए:

Select * from events where ST_Intersects(ST_SetSRID(ST_MakeBox2D(ST_MakePoint(swLon, swLat), 
    ST_MakePoint(neLon, neLat)),4326), geom) 
order by relevancy desc limit 100;

आप दो सेट बिंदुओं के साथ ST_MakeBOX2D का उपयोग करके अपने चौराहे के लिए बाउंडिंग बॉक्स बनाते हैं, जो बाउंडिंग बॉक्स के विकर्ण कोनों पर होगा, इसलिए SW और NE या NW और SE जोड़े दोनों काम करेंगे।

जब आप इस पर व्याख्या चलाते हैं, तो आप पाएंगे कि स्थानिक सूचकांक शामिल है। यह लोन और लेट कॉलम पर दो अलग-अलग इंडेक्स से काफी बेहतर प्रदर्शन करेगा, क्योंकि आप केवल दो बी-पेड़ की बजाय स्थानिक खोज के लिए अनुकूलित एक अनुक्रमित मार रहे हैं। मुझे एहसास है कि यह इसे करने का एक और तरीका दर्शाता है और अप्रत्यक्ष रूप से छोड़कर, आपके मूल प्रश्न का उत्तर नहीं देता है।

संपादित करें: माइक टी ने बहुत अच्छी बात कही है कि 4326 में बाउंडिंग बॉक्स खोजों के लिए, ज्यामिति डेटा प्रकार का उपयोग करना अधिक उपयुक्त और तेज़ है और SRID के रूप में &&ऑपरेटर को वैसे भी अनदेखा कर दिया जाएगा, जैसे,

 where ST_MakeBox2D(ST_MakePoint(swLon, swLat), ST_MakePoint(neLon, neLat)) && geom



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. RANGE PRECEDING केवल UNBOUNDED के साथ समर्थित है

  2. sqlalchemy का उपयोग करके एक डेटारेंज के साथ एक बहिष्कृत बाधा कैसे बनाएं?

  3. PostgreSQL:केस असंवेदनशील स्ट्रिंग तुलना

  4. INSERT ... ON CONFLICT ... के साथ सभी कॉलम कैसे अपडेट करें?

  5. django प्रोजेक्ट के साथ PostgreSQL की स्थापना