Tüm Şemada PostGIS'te Uzamsal Dizin Oluşturma


9

PostGIS veritabanına SPIT (QGIS eklentisi) kullanarak bir dizi şekil dosyası yükledim. Bu katmanlar, yüklendikten sonra bir Uzamsal Dizin oluşturmamıştır. Her katman için bir sorgu yazmadan şemadaki her katman için bir Uzamsal Dizin oluşturmak için bir yol olup olmadığını merak ediyorum. Ben iyi bir PostGIS senaryo yazarı değilim, bu yüzden herhangi bir yardım büyük mutluluk duyacağız.

Teşekkürler

Yanıtlar:


8

Geometri sütunlarında toplu olarak dizin oluşturmak istiyorsanız, yeni oluşturduğum bu plpgsql işlevini deneyebilirsiniz:

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;

Ben veritabanımda öfke denemedim, ama iş yapmak gibi görünüyor.

Kullanmak için sadece şöyle bir SELECTifade çalıştırın :

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

Tüm geometri sütunlarında dizinler oluşturmak için dizini şu şekilde kullanabilirsiniz:

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

Daha sonra, VACUUM ANALYZEher şeyi düzenlemek için a çalıştırın .


Çok teşekkür ederim, harika görünüyor. Bunu çalıştırdım, ama bir sorun var gibi görünüyor, bakalım, bu senaryo yazma yeteneğimden yoksun olabilir. Ancak SELECT deyimlerini çalıştırdığımda şu hatayı alıyorum: HATA: işlev batchindex (bilinmeyen, karakter değişiyor, karakter değişiyor) yok LINE 1: select BatchIndex ('public', f_table_name, f_geometry_column) ... Emin değilim toplu işi almak için bir şey ekleyeceksem veya bu sadece farklı bir şey için bir yer tutucuysa. CREATE sorgusu sorunsuz bir şekilde gerçekleşti, ancak hiçbir dizin oluşturulmadı.
Ryan Garnett

Hmm ... Orada ne olduğundan emin değilim. Geçtiğiniz ilk parametrenin alarm zillerini kapatmak unknownyerine tipte olduğunu düşünmesi character varying, ancak nerede bir sorun olduğunu göremiyorum. Biraz düşüneceğim, bu arada herhangi bir PostgreSQL gurusu var mı? :)
MerseyViking

2

Geometriye sahip görünümleriniz varsa en iyi yanıt çalışmaz. Bir görünümde dizin oluşturmaya çalışıp çalışmadığınızı kontrol etmek için 'IF' deyimini değiştirmek bu sorunu çözer. Görünümleri geometri ile kullanmak istiyorsanız bu satırı değiştirin:

IF i_exists = 0

Bununla:

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

1

tablonuzun 'bina' olduğunu söyleyin, GIST'i kullanarak dizin oluşturabilirsiniz

CREATE INDEX building_gindx ON building USING GIST (geom);

Aradığınız şey bu mu?


Teşekkürler Naresh, hayır ben bir toplu iş sisteminde, bir şemadaki tüm tablolar için dizinler oluşturmak için bir yol arıyorum.
Ryan Garnett
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.