空间索引
📄字数 3.2K
👁️阅读量 加载中...
索引介绍
虚谷空间数据库提供R树索引。R树(RTree)是一种常用的空间数据索引结构,特别适合管理二维或多维空间对象(如点、线、多边形等)。它以最小外接矩形(MBR)为基本单元,构建分层结构,加速空间查询,如范围查询和邻近查询。
R树索引支持简单几何类型和复杂空间类型。
| 数据类型 | 类型名称 |
|---|---|
| 简单几何类型 | POINT、BOX、POLYGON和CIRCLE |
| 复杂空间类型 | GEOMETRY、GEOGRAPHY |
创建索引
语法说明
R树索引支持使用两种语法构建,分别为GiST语法和RTree语法。
- GiST语法是一种兼容语法,内部使用的是RTree语法。
- 两种语法内部都使用构建选项,RTree语法使用默认构建选项。
GiST语法
语法格式
sql
IndexStmt::=
CREATE INDEX index_name ON table_name USING GIST (index_elem ["," index_elem]) [gist_build_opt];
gist_build_opt::=
WITH (MODE = 'auto'|'buffer'|'sort'|'basic' [gist_build_page_num])
gist_build_page_num::=
EMPTY | ICONST参数说明
gist_build_opt:构建选项,默认为MODE = 'auto' 64。MODE:构建模式。auto:自动优化构建,根据字段类型、表有效行数等参数自动选择构建方法。buffer:强制使用缓存优化构建。sort:强制使用排序优化构建。basic:不使用优化构建。
gist_build_page_num:缓冲区页数,默认为64,范围为[1,128],不推荐修改。只有MODE设置为auto或buffer时,才能指定缓冲区页数。
使用说明
自动优化构建:
- 表行数小于1048576,使用
basic。 - 表行数大于或等于1048576:
- 所有索引字段类型都是POINT或GEOMETRY ,使用
sort。 - 存在非POINT和GEOMETRY类型的索引字段,使用
buffer。
- 所有索引字段类型都是POINT或GEOMETRY ,使用
- 表行数小于1048576,使用
排序优化构建:
- 仅支持POINT和GEOMETRY类型的字段。
- 如果无法使用排序优化,会选择使用缓存优化
buffer。 - 如果是联合索引,那么必须每个索引字段都是POINT或GEOMETRY类型才能使用
sort优化。
索引构建方法的对比:
- 索引创建耗时:
basic>buffer>sort。 - 索引查询耗时:
sort>buffer=basic,对大部分数据集,sort优化创建的索引的查询效率不会比其它模式差。 - 系统内存资源占用:
buffer>sort>basic。
- 索引创建耗时:
gist_build_opt使用场景:- 场景一:表行数小于1048576,默认不使用优化。为了加快索引创建,可以使用
sort强制使用优化; - 场景二:字段类型为POINT或GEOMETRY,若
sort优化创建的索引的查询效率差,可以使用buffer创建索引。
- 场景一:表行数小于1048576,默认不使用优化。为了加快索引创建,可以使用
提示
指定构建选项时:
- 构建选项并不会被持久化,只会在单一工作节点的内存中临时存在。
- 重新开表后或在其他工作节点执行的索引重建操作会使用默认构建选项。
- 数据库与表导出、备份与恢复会忽略创建语法的构建选项。
示例
示例1
为表geom_tb的字段geom创建RTree索引。sqlCREATE TABLE geom_tb(gid INT,geom GEOMETRY); CREATE INDEX gidx ON geom_tb USING GIST (geom);示例2
使用缓存优化,为表geom_tb的字段geom创建RTree索引。sqlCREATE TABLE geom_tb(gid INT,geom GEOMETRY); CREATE INDEX gidx ON geom_tb USING GIST (geom) WITH (MODE = 'buffer');示例3
使用排序优化,为表geom_tb的字段geom创建RTree索引。sqlCREATE TABLE geom_tb(gid INT,geom GEOMETRY); CREATE INDEX gidx ON geom_tb USING GIST (geom) WITH (MODE = 'sort');
RTree语法
语法格式
sql
IndexStmt::=
CREATE INDEX index_name ON table_name (index_elem ["," index_elem]) [INDEXTYPE IS RTREE];参数说明
index_elem:索引的列,如果字段是POINT、BOX、POLYGON、CIRCLE、GEOMETRY或GEOGRAPHY这6种类型,默认创建RTree索引。INDEXTYPE IS RTREE:指定索引类型为RTree时,如果字段是上述6种数据类型之一,则创建RTree索引,其他类型则报错。
示例
为表geom_tb的字段geom创建RTree索引。
sql
CREATE TABLE geom_tb(gid INT,geom GEOMETRY);
CREATE INDEX gidx ON geom_tb (geom) INDEXTYPE IS RTREE;使用索引优化查询
功能说明
空间索引支持空间拓扑关系的操作符和函数,查询语句的WHERE条件含有空间类型的操作符或函数时,可以使用索引优化查询。
当前版本空间索引暂不支持以下功能:
- 空间距离关系的操作符和函数:例如
<->、ST_DWithin等。 - 连接、分组、子查询等复杂查询。
- 并行索引扫描。
- 超过四个字段的空间联合索引。
- 分区空间索引。
语法格式
sql
selectstmt::=
SELECT [HINT_TEXT] target_el[,target_el] FROM table_name WHERE bool_expr;
bool_expr::=
index_field SPOp const_expr
| const_expr SPOp index_field
| SPMethod(index_field,const_expr)
| SPMethod(const_expr,index_field)
| bool_expr ROp bool_expr参数说明
内置几何操作符
| 类型名称 | 支持索引优化的几何操作符 |
|---|---|
| POINT | |>> >^ <<| <^ << >> ~= <@ |
| BOX | << &< && &> >> ~= @> <@ &<| <<| |>> |&> |
| POLYGON | << &< && &> >> ~= @> <@ &<| <<| |>> |&> |
| CIRCLE | << &< && &> >> ~= @> <@ &<| <<| |>> |&> |
| GEOMETRY | << &< && &> >> ~= ~ @ &<| <<| |>> |&> |
| GEOGRAPHY | && |
内置几何函数
| 类型名称 | 支持索引优化的几何函数 |
|---|---|
| GEOMETRY | ST_Intersects ST_Touches ST_Overlaps ST_Crosses ST_Contains ST_Within ST_Covers ST_CoveredBy ST_OrderingEquals ST_Equals ST_ContainsProperly |
| GEOGRAPHY | ST_Intersects ST_Covers ST_CoveredBy |
示例
创建表和索引。
sql
CREATE TABLE geom_tb(gid INT,geom GEOMETRY);
CREATE INDEX gidx ON geom_tb USING GIST (geom);提示
查询不一定会使用索引,优化器会基于代价做路径选择。
使用&&操作符查询所有与给定边界框(3,3,4,4)相交的几何对象。
sql
SELECT * FROM geom_tb WHERE geom && ST_MakeEnvelope(3,3,4,4);
SELECT * FROM geom_tb WHERE ST_MakeEnvelope(3,3,4,4) && geom;使用ST_Intersects函数查询所有与给定边界框(3,3,4,4)相交的几何对象。
sql
SQL> SELECT * FROM geom_tb WHERE ST_Intersects(geom,ST_MakeEnvelope(3,3,4,4));
+-----+------+
| GID | GEOM |
+-----+------+
+-----+------+
SQL> SELECT * FROM geom_tb WHERE ST_Intersects(ST_MakeEnvelope(3,3,4,4),geom);
+-----+------+
| GID | GEOM |
+-----+------+
+-----+------+使用&&操作符查询所有同时与两个不同边界框(3,3,4,4)和(3.5,3.5,4.5,4.5)相交的几何对象。
sql
SQL> SELECT * FROM geom_tb WHERE geom && ST_MakeEnvelope(3,3,4,4) AND geom && ST_MakeEnvelope(3.5,3.5,4.5,4.5);
+-----+------+
| GID | GEOM |
+-----+------+
+-----+------+使用&&操作符查询所有与任意一个边界框(3,3,4,4)或(3.5,3.5,4.5,4.5)相交的几何对象。
sql
SQL> SELECT * FROM geom_tb WHERE geom && ST_MakeEnvelope(3,3,4,4) OR geom && ST_MakeEnvelope(3.5,3.5,4.5,4.5);
+-----+------+
| GID | GEOM |
+-----+------+
+-----+------+