पोस्टगिस डेटाबेस क्वेरी ऑप्टिमाइज़ेशन


10

मेरे पास DTED प्रारूप में रस्टर्स का एक सेट है, जिसे मैं raster2pgsql कमांड लाइन टूल का उपयोग करके PostGIS डेटाबेस में लोड करता हूं।

प्रत्येक रेखापुंज बस एक पंक्ति में संग्रहीत किया जाता है और छुटकारा और रास्टर प्रारूप के मूल्य द्वारा वर्णित किया जाता है।

अब, मैं एक डेटाबेस फ़ंक्शन बनाना चाहता हूं जो एक बिंदु के देशांतर और अक्षांश लेता है और इस बिंदु के अनुरूप पिक्सेल का एक मान लौटाता है।

मेरे पास समस्या यह है कि ऐसा करने में काफी समय लगता है (3-4 सेकंड) क्योंकि डेटाबेस ओडायराइड बोर्ड पर काम करता है।

मुझे पता है कि मेरे द्वारा प्रोसेस की जाने वाली डेटासेट काफी बड़ी है (चींटियां पूरे यूके क्षेत्र को कवर करती हैं) लेकिन जैसा कि मैं PostgreSQL और PostGIS से बहुत परिचित नहीं हूं मुझे संदेह है कि यह तेजी से किया जा सकता है।

यह वही है जो मैंने अब तक किया है:

SELECT ST_Value(rast, ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326))
FROM (
    SELECT * FROM rasters
    WHERE rast && ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326)
) x;

$1और $2क्रमशः लंबे और अव्यक्त हैं।


2
जब आपने पोस्टगिस के लिए आयात किया था तो क्या आपने टाइलों में रास्टर को काट दिया था? (पैरामीटर-टी चौड़ाई x ऊँचाई)?
उत्परिवर्तन

हाँ, मैंने किया। इसने एक प्रदर्शन को थोड़ा सुधार दिया। मुझे शायद यह भी जोड़ना चाहिए कि डेटाबेस ओड्रोइड बोर्ड पर है, इसलिए यह डेस्कटॉप पीसी की तुलना में काफी धीमा काम करता है। मैं बस सोच रहा था कि क्या मैं किसी तरह से आपदाओं के प्रसंस्करण के दृष्टिकोण को बदल सकता हूं ताकि यह कम अनावश्यक गणना करता है। उदाहरण के लिए, शुरू में, मैं सभी चूहों पर ST_Value फ़ंक्शन को कॉल कर रहा था और फिर मैं उस पंक्ति की तलाश करूंगा जिसमें वास्तव में कोई मूल्य नहीं है। यह सबसे सरल तरीका था लेकिन बहुत धीमी गति से काम किया।
zedsdead

2
यदि ST_SetSRID(ST_MakePoint($1, $2),4326)स्ट्रिंग में पर्याप्त पुनरावृत्तियाँ हैं तो कुछ समय के लिए स्ट्रिंग कॉन्सर्ट के बदले में उपयोग करना आपको बचा सकता है।
15

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

2
हो सकता है कि आप यह समझने के लिए "स्पष्टीकरण" का उपयोग करने की कोशिश कर सकें कि बोतल की गर्दन कहाँ है।
mutolisp

जवाबों:


1

आप यह कोशिश कर सकते हैं:

--calculate and store geom point just One time
WITH point_geom AS 
(
    SELECT ST_setsrid(ST_GeomFromText('POINT('|| $1 || ' '|| $2 || ')'), 4326) as geom
)
-- Your subquery is maybe useless , alias "x" isn't used
SELECT ST_Value( rast, point_geom.geom )
FROM rasters
WHERE rast && point_geom.geom;

लेकिन असली समस्या रिस्टर क्वेरिंग है; डेटासेट को खंगालते हुए प्रश्नों को गति देनी चाहिए। आप PostGIS WKT रैस्टर का उपयोग करने और इस ट्यूटोरियल का अनुसरण करने का प्रयास कर सकते हैं ।

मुझे आशा है कि यह उपयोगी होगा,

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