我对 postgresql 如何使用索引有疑问。我在启用 Postgis 的数据库的 Postgresql 中基于地理类型列的 Gist 索引表达式存在问题。
我有下表:
CREATE TABLE place
(
id serial NOT NULL,
name character varying(40) NOT NULL,
location geography(Point,4326),
CONSTRAINT place_pkey PRIMARY KEY (id )
)
然后我根据“位置”列创建了 Gist 索引表达式
CREATE INDEX place_buffer_5000m ON place
USING GIST (ST_BUFFER(location, 5000));
现在假设在表格路线中,我有带有 Linestring 对象的列形状,并且我想检查线交叉的 5000m 多边形(围绕该位置)。
我认为下面的查询应该使用“place_buffer_5000m”索引但不使用它。
SELECT place.name
FROM place, route
WHERE
route.id=1 AND
ST_CROSSES(route.shape::geometry, ST_BUFFER(place.location, 5000)::geometry))
表的地方有大约 76000 行。使用重新创建“place_buffer_5000m”索引在此表上运行分析和清理,但在上述查询期间未使用该索引。
当我在名为“area_5000m”(地理类型)的表格位置创建另一列并更新表格时,有什么有趣的:
UPDATE place SET area_5000m=ST_BUFFER(location, 5000)
然后像这样为此列创建要点索引:
CREATE INDEX place_area_5000m ON place USING GIST (area_5000m)
然后使用查询:
SELECT place.name
FROM place, route
WHERE
route.id=1 AND
ST_CROSSES(route.shape::geometry, place.area_5000m::geometry))
使用索引“place_area_5000m”。问题是为什么不使用基于位置列计算的索引表达式?