PostGIS中的空间索引(二)

本文介绍SP-GiST索引及PostGIS中索引的使用:

  1. SP-GiST
  2. 以及如何使用索引

前面的文章介绍了两种索引,本文介绍SP-GiST索引及全部PostGIS中的索引使用方法。

1. SP-GiST 索引

SP-GiST代表“空间分区的通用搜索树”,它是索引的一种通用形式,它支持分区的搜索树,例如四叉树,k-d树和基数树(重试)。这些数据结构的共同特征是,它们将搜索空间重复地划分为不必具有相同大小的分区。除GIS索引外,SP-GiST还用于加速对多种数据的搜索,例如电话路由,ip路由,子字符串搜索等。

与GiST索引一样,SP-GiST索引有损,因为它们存储了包围空间对象的边界框。

SP-GiST索引可以视为GiST索引的替代方法。性能测试表明,当有许多重叠的对象时,即所谓的“意大利面条数据”,SP-GiST索引特别有用。

一旦GIS数据表超过几千行,就可以使用SP-GiST索引来加速数据的空间搜索。在“ geometry”列上构建SP-GiST索引的语法如下:

CREATE INDEX [indexname] ON [tablename] USING SPGIST ( [geometryfield] ); 

建立空间索引是计算量大的操作。它还会在创建表时阻止对表的写访问,因此,在生产系统上,以较慢的“并发感知”方式进行:

CREATE INDEX [indexname] ON [tablename] USING SPGIST ([geometryfield] spgist_geometry_ops_3d);

构建索引后,有时强制PostgreSQL收集表统计信息(用于优化查询计划)会有所帮助:

VACUUM ANALYZE [table_name] [(column_name)];

SP-GiST索引可以加快涉及以下运算符的查询:

  • <<, &<, &>, >>, <<|, &<|, |&>, |>>, &&, @>, <@, and ~=, 二维索引。
  • &/&, ~==, @>>, and <<@, 三维索引.

目前不支持kNN搜索。

2. 在PostGIS中如何使用索引

通常,索引会无形地加快数据访问速度:建立索引后,查询计划者会透明地决定何时使用索引信息来加快查询计划。不幸的是,PostgreSQL查询计划程序有时不能很好地优化GiST索引的使用,因此有时应该使用空间索引的搜索可能会对整个表进行顺序扫描。

如果发现您的空间索引没有被使用(或属性索引),则可以执行以下几项操作:

首先,阅读查询计划并检查查询是否实际尝试计算您需要的东西。失控的JOIN条件(被遗忘或错误的表)可能会意外地使所有表多次出现。要获取查询计划,请在查询前面添加EXPLAIN关键字。

其次,确保收集有关表中值的数量和分布的统计信息,以向查询计划者提供更好的信息,以便围绕索引使用情况做出决策。 VACUUM ANALYZE将计算两者。

无论如何,都应该定期清理数据库-许多PostgreSQL DBA定期将VACUUM作为非高峰cron作业运行。

如果清理不起作用,则可以通过将set enable_seqscan设置为off来临时强制计划器使用索引信息。命令。这样,您可以检查计划程序是否完全能够为您的查询生成索引加速的查询计划。仅应将此命令用于调试:通常而言,计划者比何时使用索引更了解。运行查询后,请不要忘记重新启用ENABLE_SEQSCAN,以便其他查询将正常使用计划程序。

如果将enable_seqscan设置为off;帮助查询运行,您的Postgres可能不适合您的硬件。如果发现计划者关于顺序扫描和索引扫描的开销有误,请尝试减少````postgresql.confrandom_page_cost的值,或将setrandom_page_cost```设置为1.1;。该参数的默认值为4,请尝试将其设置为1(在SSD上)或2(在快速磁盘上)。减小该值可使计划者更倾向于使用索引扫描。

如果将enable_seqscan设置为off;不能有助于查询,可能是因为使用的构造Postgres尚无法解开。带有内联选择的子查询就是一个示例-需要将其重写为可以优化LATERAL JOIN的表单计划者。

你可能感兴趣的:(Postgis,GIS,PostGIS,空间索引,GIS,数据库)