查找缺少索引的PostGIS表?


10

最近,我环顾四周pg_stat_user_tables,很惊讶地发现我的一些空间桌子上有大量连续扫描。当然,这些表缺少空间索引。

如何找到带有未索引几何列的所有表?


感谢对pg_stat_user_tables的引用。令人鼓舞的是,您所认识的人承认这种错误。对于我指导的工作中的年轻人,我总是说:如果主键没有自然候选者,则添加一个序列列。始终定义SRID和几何类型。始终添加空间索引。因为序列扫描可能可以处理一百万行,但是,有一点很重要……按照我说的去做,而不要像:D那样做。
约翰·鲍威尔

Answers:


9

缺少空间索引的表可以通过查询系统表来找到:

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;

会更好WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'吗?参见trac.osgeo.org/gdal/ticket/6896
user30184

@ user30184您能解释一下t.typtype = 'b'吗?
dbaston

1
它实际上是没用的。当标准PostgreSQL数据库具有名为“ geometry”的表时,GDAL中的代码更改是用于处理罕见情况的。在pg_type中也有一个条目,但带有typtype ='c'。但是,如果您安装了PostGIS,则不可能结束这种情况。create table "geometry" (foo text);ERROR: 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 '17

6

我创建了一个可以自动创建所有缺失索引的函数。“模拟”参数允许获取缺少的空间索引的列表,但不执行CREATE INDEX

参见https://gist.github.com/mdouchin/cfa0e37058bcf102ed490bc59d762042

要获取缺少索引的列表,请运行:

SELECT * FROM create_missing_spatial_indexes(True)

要创建所需的索引,请运行:

SELECT * FROM create_missing_spatial_indexes()

要么

SELECT * FROM create_missing_spatial_indexes(False)

像魅力一样工作!很棒的工具。
RyanKDalton
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.