在整个架构的PostGIS中创建空间索引


9

我已经使用SPIT(QGIS插件)将许多shapefile加载到了PostGIS数据库中。这些图层在加载时没有创建空间索引。我想知道是否有一种方法可以为架构中的每个层创建一个空间索引,而无需为每个层编写查询。我不是一名优秀的PostGIS脚本编写者,因此将不胜感激。

谢谢

Answers:


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语句时,出现以下错误:错误:函数batchindex(未知,字符变化,字符变化)不存在LINE 1:选择BatchIndex('public',f_table_name,f_geometry_column)...我不确定如果我要添加任何东西来获取批处理,或者这只是占位符而已。CREATE查询运行没有问题,但是没有生成索引。
瑞安·加内特

嗯...我不知道那是怎么回事。它认为您要传递的第一个参数是类型,unknown而不是character varying发出警钟,但我看不出它在哪里出了问题。我会考虑一下,与此同时,任何有经验的PostgreSQL专家都愿意尝试一下吗?:)
MerseyViking

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);

那是您要找的东西吗?


谢谢Naresh,不,我正在寻找一种在批处理系统中为架构中的所有表创建索引的方法。
瑞安·加内特
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.