我已经使用SPIT(QGIS插件)将许多shapefile加载到了PostGIS数据库中。这些图层在加载时没有创建空间索引。我想知道是否有一种方法可以为架构中的每个层创建一个空间索引,而无需为每个层编写查询。我不是一名优秀的PostGIS脚本编写者,因此将不胜感激。
谢谢
我已经使用SPIT(QGIS插件)将许多shapefile加载到了PostGIS数据库中。这些图层在加载时没有创建空间索引。我想知道是否有一种方法可以为架构中的每个层创建一个空间索引,而无需为每个层编写查询。我不是一名优秀的PostGIS脚本编写者,因此将不胜感激。
谢谢
Answers:
如果要在几何列上批量创建索引,可以尝试使用我刚刚敲过的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
以整理所有内容。
unknown
而不是character varying
发出警钟,但我看不出它在哪里出了问题。我会考虑一下,与此同时,任何有经验的PostgreSQL专家都愿意尝试一下吗?:)