20.6. 分区的PostGIS索引配置¶
GeoMesa提供了各种可用于定制和优化给定安装的配置选项。看见 设置架构选项 了解有关设置配置参数的详细信息。请注意,分区的PostGIS存储不支持GeoMesa存储的大多数常规选项,但下面指定的除外。
20.6.1. 配置默认日期属性¶
默认日期属性是用于将数据分类到分区中的属性。看见 设置索引日期属性 以获取有关如何指定它的详细信息。
20.6.2. 配置索引¶
要素类型中的属性可以标记为索引,这将在关联的表列上创建B树索引。看见 属性索引 获取有关如何指定索引的详细信息。
20.6.3. 配置分区大小¶
可以为特定分区大小配置每种功能类型。分区大小指定为每个分区将覆盖的小时数,并且必须是24的除数,即 1
, 2
, 3
, 4
, 6
, 8
, 12
或 24
。
小时数应基于预期数据量和查询类型。由于分区清理,PostGIS将不需要扫描位于给定查询窗口之外的分区。
分区大小是使用密钥配置的 pg.partitions.interval.hours
。
SimpleFeatureType sft = ....;
sft.getUserData().put("pg.partitions.interval.hours", "12");
20.6.4. 配置索引分辨率¶
每种要素类型都可以在每个范围内配置页数。分区表使用 BRIN 索引,这是一种有损的索引结构。存储在每个索引范围中的数据页的数量控制着索引的有损程度和大小。默认情况下,Postgres在每个范围内存储128页。存储较少的页面通常会提高索引的效率,但代价是需要更多空间;然而,最佳数量将取决于数据特征和典型查询模式。
页数是用密钥配置的 pg.partitions.pages-per-range
。
SimpleFeatureType sft = ....;
sft.getUserData().put("pg.partitions.pages-per-range", "64");
20.6.5. 配置数据老化¶
每种功能类型都可以配置为自动删除早于特定阈值的分区。这是通过设置要保留的最大分区数来实现的。数据的使用期限将取决于每个分区中的小时数(见上文)。例如,保留14个分区,其中每个分区为12小时,将保留上周的数据值。
如果未指定,则不会自动删除数据。
使用键配置老化 pg.partitions.max
。
SimpleFeatureType sft = ....;
sft.getUserData().put("pg.partitions.max", "14");
20.6.6. 配置过滤器优化¶
默认情况下,GeoMesa将忽略包含整个World的过滤器,即它们包含所有 [-180, 180]
longitude and [-90 90]
latitude. This may speed up such queries, but it may also produce incorrect results if there are geometries outside the world bounds, or if the data is not stored in EPSG:4326
/WGS84
。
可以通过键配置此行为 pg.partitions.filter.world
。缺省值为 false
,它将忽略整个世界的过滤器。
SimpleFeatureType sft = ....;
// enable filtering on "whole world" queries
sft.getUserData().put("pg.partitions.filter.world", "true");
20.6.7. 配置表空间¶
可以将每种功能类型配置为对不同的分区表使用不同的表空间。由于所有写入最初都会写入预写表,因此将其放在快速磁盘上可能是有益的。相反,由于主分区只写入一次,通常不会更新,因此将它们放在较慢的存储上可能是可以接受的。
正在使用的PostreSQL实例中必须已存在任何已配置的表空间。
表空间是使用密钥配置的 pg.partitions.tablespace.wa
, pg.partitions.tablespace.wa-partitions
和 pg.partitions.tablespace.main
。看见 餐桌设计 查看不同表格的详细信息。
SimpleFeatureType sft = ....;
sft.getUserData().put("pg.partitions.tablespace.wa", "fasttablespace");
一旦创建了架构,表空间就存储在 partition_tablespaces
桌子。可以手动修改该表,以更改用于新分区的位置。
20.6.8. 配置维护计划¶
维护脚本每10分钟运行一次,以便在预写表和分区表之间移动数据。默认情况下,计划是随机的,以避免所有要素类型同时运行维护。要指定脚本应该运行的确切分钟数,请使用键 pg.partitions.cron.minute
。
计划的分钟必须介于0和8之间(包括0和8)。例如,将计划分钟设置为1将导致脚本在00:01、00:11、00:21、00:31等时间运行。
预写表在每10分钟数据块的第9分钟滚动。因此,在分钟0运行维护将以最快的速度将数据移出预写表。由于每个查询都必须读取预写表,因此更快地将数据移出该表可能会提高性能。
SimpleFeatureType sft = ....;
sft.getUserData().put("pg.partitions.cron.minute", "0");