使用合适的时空索引
合适的索引能加快查询速度,需要根据应用场景的要求来构建合适的索引。可针对轨迹数据类型构建以下索引:
- 空间索引:只针对轨迹的空间范围建立索引,适合只查询轨迹空间范围情况。
- 时间索引:只针对轨迹的时间范围建立索引,适合只查询轨迹时间范围情况。
- 时空复合索引:建立时空联合索引,适合时间和空间同时过滤查询。
--创建基于函数的空间索引,加速空间过滤
create index tr_spatial_geometry_index on trajtab using gist (st_trajectoryspatial(traj));
--创建基于函数的时间段索引,加速时间过滤
create index tr_timespan_time_index on trajtab using gist (st_timespan(traj));
--创建基于函数的轨迹起止时间
create index tr_starttime_index on trajtab using btree (st_starttime(traj));
create index tr_endtime_index on trajtab using btree (st_endtime(traj));
--首先创建btree_gist扩展
create extension btree_gist;
--建立btree_gist 起始时间、终止时间、空间复合索引
create index tr_traj_test_stm_etm_sp_index on traj_test using gist (st_starttime(traj),st_endtime(traj),st_trajectoryspatial(traj));
采用合理的分区表
随着使用时间的增加,数据库中的轨迹数据量也不断增加,导致数据库索引变大,查询变慢。您可考虑采用分区表的模式降低单表数据量。
使用分区表请参见PostgreSQL文档中分区表相关章节。
减少使用字符串类型属性
轨迹属性中如有大量的字符串属性,会导致存储空间浪费和性能下降。
- 如果字符串为固定内容,可以转换为整型进行枚举,建议在程序中进行转换;
- 如果无法避免使用字符串类型属性,可指定字符串类型默认长度,避免空间浪费。
设置字符串类型默认长度方法如下:
-- 设置字符串类型默认长度为32 Set ganos.trajectory.attr_string_length = 32;
采用批量轨迹生成模式
使用批量轨迹点生成轨迹模式,避免采取单个轨迹点追加模式。
采用优化压缩模式
lz4 压缩算法是一种优秀的压缩算法,具有更高的压缩率和更快的执行速度。如果要启用lz4压缩算法,设置方法如下:
-- 设置使用lz4 压缩
Set toast_compression_use_lz4 = true;
-- 使用pg默认压缩算法
Set toast_compression_use_lz4 = false;
如果要对整个数据默认采用lz4压缩算法,设置方法如下:
-- 数据库使用lz4压缩
Alter database dbname Set toast_compression_use_lz4 = true;
-- 数据库使用默认压缩
Alter database dbname Set toast_compression_use_lz4 = false;