Dizinleri eksik PostGIS tabloları mı arıyorsunuz?


10

Son zamanlarda etrafa bakıyordum pg_stat_user_tablesve bazı uzamsal tablolarımda çok sayıda ardışık tarama görmekten şaşırdım. Tabii ki, bu tablolarda uzamsal dizinler eksikti.

Dizine eklenmemiş bir geometri sütununa sahip tüm tabloları nasıl bulabilirim?


Pg_stat_user_tables ref için teşekkürler. Bilginiz olan birinin bu tür hataları kabul etmesi cesaret vericidir. İşyerinde danışmanlık yaptığım gençlere her zaman şunu söylüyorum: Birincil anahtar için doğal bir aday yoksa, bir seri sütun ekleyin. Daima SRID ve geometri tipini tanımlayın. Her zaman bir uzamsal dizin ekleyin. Sıralı taramalar bir milyon satırla çalışabileceğinden, bir nokta var ..... Dediğim gibi yap, yaptığım gibi değil: D.
John Powell

Yanıtlar:


9

Uzamsal dizinleri olmayan tablolar, sistem tabloları sorgulanarak bulunabilir:

SELECT g.* 
FROM 
  (SELECT 
     n.nspname, 
     c.relname, 
     c.oid AS relid, 
     a.attname, 
     a.attnum 
   FROM pg_attribute a 
   INNER JOIN pg_class c ON (a.attrelid=c.oid)
   INNER JOIN pg_type t ON (a.atttypid=t.oid)
   INNER JOIN pg_namespace n ON (c.relnamespace=n.oid) 
   WHERE t.typname='geometry' 
   AND   c.relkind='r'
 ) g 
LEFT JOIN pg_index i ON (g.relid = i.indrelid AND g.attnum = ANY(i.indkey)) 
WHERE i IS NULL;

Daha iyi olabilir WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'mi? Bkz. Trac.osgeo.org/gdal/ticket/6896 .
user30184

@ user30184 Bunun bir t.typtype = 'b'parçasını açıklayabilir misiniz ?
dbaston

1
Aslında işe yaramaz bir parça. GDAL'deki kod değişikliği, standart PostgreSQL veritabanında "geometri" adlı bir tablo olduğunda nadir bir durumla başa çıkmak içindi. Bunun da pg_type içinde bir girdi var ancak typtype = 'c' ile girişi var. Ancak, PostGIS yüklüyse, bu tür bir durumun sona ermesi mümkün değildir. create table "geometry" (foo text);verirERROR: type "geometry" already exists HINT: A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type.
user30184

6

Tüm eksik dizinleri otomatik olarak oluşturabilen bir işlev oluşturdum. Bir "simulate" parametresi, eksik uzamsal dizinlerin listesinin alınmasına izin verir, ancak CREATE INDEX gerçekleştirmez

Bkz. Https://gist.github.com/mdouchin/cfa0e37058bcf102ed490bc59d762042

Eksik dizinlerin listesini almak için şunu çalıştırın:

SELECT * FROM create_missing_spatial_indexes(True)

Gerekli dizinleri oluşturmak için şunu çalıştırın:

SELECT * FROM create_missing_spatial_indexes()

veya

SELECT * FROM create_missing_spatial_indexes(False)

Bir cazibe gibi çalıştı! Harika bir araç.
RyanKDalton
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.