Postgresql Postgis ST_DWithin查询运行缓慢

Postgresql Postgis ST_DWithin查询运行缓慢,postgresql,postgis,Postgresql,Postgis,我有实时公交位置和公交站点时间和位置的数据。它们分为两个表: 车辆位置行程(约3 1000万条记录,实时位置数据,包括纬度/经度点坐标) 站点时间位置(约140万条记录,公交站点位置,包括纬度/经度点坐标和公交站点时间) 我正在尝试查找特定公交线路的公交车站15米范围内的所有车辆位置,查询未使用索引,运行速度非常慢 我正在使用ST_Dwithin和以下查询: 选择T.trip\u id,T.ROUTEMAJOR 从车辆\u位置\u行程为T 内部连接停止\u时间\u位置为X 关于ST_DWithi

我有实时公交位置和公交站点时间和位置的数据。它们分为两个表:

车辆位置行程(约3 1000万条记录,实时位置数据,包括纬度/经度点坐标)

站点时间位置(约140万条记录,公交站点位置,包括纬度/经度点坐标和公交站点时间)

我正在尝试查找特定公交线路的公交车站15米范围内的所有车辆位置,查询未使用索引,运行速度非常慢

我正在使用ST_Dwithin和以下查询:

选择T.trip\u id,T.ROUTEMAJOR
从车辆\u位置\u行程为T
内部连接停止\u时间\u位置为X
关于ST_DWithin(T.geog,X.geog,25)
其中,T.trip_id=X.trip_id和T.trip_id不为NULL,T.ROUTEMAJOR=4
使用每个表的点坐标,我为每个表创建了一个地理列以及一个空间索引

ALTER TABLE vehicle\u position\u trips添加列geog geography(第4326点);
更新车辆位置行程设置geog=ST_GeogFromText('SRID=4326;点('| | | | |'''| | | |'));
使用gist(geog)在车辆位置行程上创建索引车辆位置地理位置idx;
ALTER TABLE stop\u time\u locations添加列geog geography(点4326);
更新停止时间位置集geog=ST_GeogFromText('SRID=4326;POINT('stop|lon | |''stop| lat | |'));
使用gist(geog)在stop\U time\U位置上创建索引stop\U times\U geog\U idx;
我还为两个表的
trip\u id
创建了一个索引:

在车辆位置行程(行程id)上创建索引位置行程id;
在停止时间位置(行程id)上创建索引停止行程id;
这是我从解释分析中得到的结果:

-聚集(成本=125964.43..445659.67行=1宽度=12)(实际时间=1978.543..2610.686行=5859循环=1)
计划人数:2人
劳工处推出:2
->并行哈希连接(成本=124964.43..444659.57行=1宽度=12)(实际时间=1971.782..2506.291行=1953循环=3)
散列条件:(t.trip\u id=x.trip\u id)
联接筛选器:((t.geog&&u st_expand(x.geog,'15':双精度))和(x.geog&&u st_expand(t.geog,'15':双精度))和_st_dwithin(t.geog,x.geog,'15':双精度,true))
由联接筛选器删除的行:670155
->车辆上的平行顺序扫描位置行程t(成本=0.00..257701.18行=6961宽度=40)(实际时间=205.792..880.096行=14423圈=3)
过滤器:((跳闸id不为空)和(routemajor=10))
被筛选器删除的行:3360183
->并行散列(成本=93174.97..93174.97行=1564997宽度=40)(实际时间=1012.117..1012.117行=1249653循环=3)
存储桶:65536批:128内存使用率:2816kB
.97行=1564997宽=40)(实际时间=50.692..314.688行=1249653圈=3)
计划时间:15.059毫秒
执行时间:2611.505毫秒
(15排)

我可以做些什么来让它运行得更快,为什么不使用任何索引?

您是否运行了
VACUUM ANALYZE tablename创建索引后?是的,我在两个表上都运行了
VACUUM ANALYZE
。表现还是一样。你的解释似乎有点混乱。例如,以“.97”开头的行不能正确且完整。出于探索目的,请执行
设置enable_seqscan=off并重新运行解释分析。看起来它现在正在使用索引,但执行时间仍然是一样的……您是否运行了
VACUUM ANALYZE tablename创建索引后?是的,我在两个表上都运行了
VACUUM ANALYZE
。表现还是一样。你的解释似乎有点混乱。例如,以“.97”开头的行不能正确且完整。出于探索目的,请执行
设置enable_seqscan=off并重新运行解释分析。看起来它现在正在使用索引,但执行时间仍然相同。。。