संपूर्ण स्कीमा पर PostGIS में स्थानिक सूचकांक बनाएँ


9

मैंने अपने PostGIS डेटाबेस में SPIT (QGIS प्लगइन) का उपयोग करके कई आकार-प्रकार लोड किए हैं। इन परतों में लोडिंग पर निर्मित स्थानिक सूचकांक नहीं था। मुझे आश्चर्य हो रहा है कि क्या प्रत्येक परत के लिए एक क्वेरी लिखे बिना स्कीमा में प्रत्येक परत के लिए एक स्थानिक सूचकांक बनाने का एक तरीका है। मैं एक अच्छा PostGIS स्क्रिप्ट लेखक नहीं हूं, इसलिए किसी भी मदद की बहुत सराहना की जाएगी।

धन्यवाद

जवाबों:


8

यदि आप जियोमेट्री कॉलम पर इंडेक्स बनाना चाहते हैं, तो आप इस plpgsql फ़ंक्शन को आज़मा सकते हैं जिसे मैंने अभी-अभी दस्तक दी है:

CREATE OR REPLACE FUNCTION BatchIndex(sn text, tn text, cn text) RETURNS void AS $$
DECLARE i_exists integer;
DECLARE idxname text;
BEGIN
  idxname := 'idx_' || tn || '_' || cn;
  select into i_exists count(*) from pg_class where relname = idxname;

  IF i_exists = 0 THEN
    EXECUTE 'CREATE INDEX ' ||idxname || ' ON '
      || sn || '.' || tn
      || ' USING GIST(' || cn || ')';
  END IF;
END;
$$ LANGUAGE plpgsql;

मैंने इसे अपने डेटाबेस पर क्रोध करने की कोशिश नहीं की है, लेकिन यह काम करने के लिए लगता है।

इसका उपयोग करने के लिए, बस SELECTइस तरह से एक स्टेटमेंट चलाएं :

select BatchIndex('public', f_table_name, f_geometry_column) from geometry_columns where f_table_schema = 'public';

सभी ज्यामिति स्तंभों पर अनुक्रमणिका बनाने के लिए, आप इसका उपयोग इस तरह कर सकते हैं:

select BatchIndex(f_table_schema, f_table_name, f_geometry_column) from geometry_columns;

बाद में, VACUUM ANALYZEसब कुछ साफ करने के लिए एक रन ।


बहुत बहुत धन्यवाद, यह बहुत अच्छा लग रहा है। मैंने इसे चलाया है, लेकिन लगता है कि एक मुद्दा है, आप पर ध्यान दें, यह मेरी स्क्रिप्टिंग क्षमता की कमी से हो सकता है। लेकिन जब मैं SELECT स्टेटमेंट चलाता हूं तो मुझे निम्नलिखित त्रुटि मिलती है: ERROR: फ़ंक्शन बैचिंडेक्स (अज्ञात, वर्ण भिन्न, वर्ण भिन्न) मौजूद नहीं है LINE 1: BatchIndex ('public', f_table_name, f_geometry_column) का चयन करें ... मुझे यकीन नहीं है अगर मुझे बैच पाने के लिए कुछ भी जोड़ना है, या अगर यह कुछ अलग करने के लिए सिर्फ एक स्थान धारक है। क्रेट क्वेरी बिना किसी समस्या के चली गई, लेकिन कोई अनुक्रमणिका उत्पन्न नहीं हुई।
रयान गारनेट

हम्म ... मुझे यकीन नहीं है कि वहाँ क्या हो रहा है। यह तथ्य कि यह सोचता है कि आप जिस पहले पैरामीटर को पास कर रहे हैं वह अलार्म बेल्स को सेट करने के unknownबजाय टाइप का character varyingहै, लेकिन मैं यह नहीं देख सकता कि इसमें कहां समस्या है। मैं इसे कुछ सोचता हूँ, इस बीच किसी भी PostgreSQL गुरु वहाँ फैंसी इसे दे रहा है? :)
१३:५१ पर जर्सी

2

यदि आप ज्यामिति के साथ विचार रखते हैं तो शीर्ष उत्तर काम नहीं करेगा। यह देखने के लिए कि क्या आप उस समस्या को हल करते हैं, किसी इंडेक्स को बनाने की कोशिश नहीं कर रहे हैं, 'IF' स्टेटमेंट को बदलना। यदि आप ज्यामिति के साथ विचारों का उपयोग करना चाहते हैं, तो इस पंक्ति को प्रतिस्थापित करें:

IF i_exists = 0

इसके साथ:

IF i_exists = 0 AND tn IN (SELECT table_name, table_type FROM information_schema.tables WHERE table_type = 'BASE TABLE')

1

मान लें कि आपकी तालिका 'भवन' है, तो आप GIST का उपयोग करके अनुक्रमण कर सकते हैं

CREATE INDEX building_gindx ON building USING GIST (geom);

क्या यह वही है जिसको आप ढूंढ रहें थे।


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