我該如何使用空間索引?
在空間 SQL 查詢中取得良好的效能,使用空間索引非常重要!您需要執行兩件事才能使用空間索引
- 建立空間索引;而且
- 使用一個具有「空間索引感知」的函數。
若要建立一個空間索引,請使用 CREATE INDEX
指令,但指定 USING GIST
存取方法,如下
CREATE INDEX mytable_geom_x ON mytable USING GIST (geom)
當連結至 GIST
存取方法時,幾何的預設索引為 R 樹。如果您忘記包含 USING GIST
部分,您將會得到一個標準 PostgreSQL「B 樹」索引,這是一個非空間索引,且無法協助您的查詢。
有一組有限的函數可以使用空間索引作為預過濾器,以加速查詢,如下所示
- ST_LineCrossingDirection
- ST_DWithin
- ST_Touches
- ST_Intersects
- ST_Crosses
- ST_Contains
- ST_ContainsProperly
- ST_Within
- ST_Covers
- ST_CoveredBy
- ST_Overlaps
- ST_DFullyWithin
- ST_3DDWithin
- ST_3DDFullyWithin
- ST_3DIntersects
- ST_OrderingEquals
- ST_Equals
因此,空間聯集查詢可以用到空間關係函數,並取得像這樣的索引加速
SELECT a.*
FROM a
WHERE ST_Intersects(a.geom, ST_Point(-126, 45, 4326))
並可以用空間關係驅動聯集,如下所示
SELECT a.name, b.id
FROM a
JOIN b
ON ST_Contains(a.geom, b.geom)
WHERE a.name = 'Pleasantown'