STV_Create_Index
对一组多边形创建空间索引,以加快与一组点的空间相交计算速度。
利用一个输入多边形集(可以是查询的结果),可以创建空间索引。空间索引是在全局命名空间中创建的。每当跨群集的节点对输入表或投影分段时,Vertica 会采用分布式计划。
OVER() 子句必须为空。
重要
在没有重新平衡群集之前,不能访问新添加的节点上的空间索引。有关详细信息,请参阅REBALANCE_CLUSTER。行为类型
注意
索引没有关联到任何特定的表。后续对输入数据源的一个或多个底层表执行 DML 命令不会修改索引。语法
STV_Create_Index( gid, g
USING PARAMETERS index='index_name'
[, overwrite={ true | false } ]
[, max_mem_mb=maxmem_value]
[, skip_nonindexable_polygons={true | false } ] )
OVER()
[ AS (polygons, srid, min_x, min_y, max_x, max_y, info) ]
实参
gid
- 唯一标识多边形的 Integer 列的名称。Gid 不能为 NULL。
g
- 包含多边形或多边形集合的几何或地理 (WGS84) 列或表达式的名称。只能对多边形和多边形集合编制索引。将从索引中排除其他图形类型。
参数
index = 'index_name'
- 索引的名称,类型为 VARCHAR。索引名称不能超过 110 个字符。索引名称中不允许使用斜杠、反斜杠和制表符。
overwrite = [ true | false ]
用于指定是否覆盖索引的 BOOLEAN(如果存在索引)。此参数不能为 NULL。
默认值: False
max_mem_mb = maxmem_value
- 用于为
STV_Create_Index
在索引构建期间可分配的内存量指定限制(以 MB 为单位)的正整数。在多节点数据库上,它是每个节点的内存限制。默认值为 256。不要分配高于 GENERAL 资源池中的内存量的值。有关该池的详细信息,请参阅监控资源池。如果为 max_mem_mb 设置的值等于或接近节点上的最大可用内存,则可能给系统性能造成不利影响。例如,它可能导致在索引构建期间,其他查询由于等待内存资源而发生超时。
skip_nonindexable_polygons = [ true | false ]
(可选)BOOLEAN
在极少的情况下,无法对复杂多边形(例如解析度过高或包含不规则尖峰)编制索引。这些多边形被视为不可编制索引。当设置为 False 时,不可编制索引的多边形会导致创建索引失败。当设置为 True 时,可通过从索引中排除不可编制索引的多边形成功创建索引。
要审查无法编制索引的多边形,请配合参数 list_polygon 使用 STV_Describe_Index。
默认值:False
返回
polygons
- 已编制索引的多边形数量。
SRID
- 空间参照系标识符。
min_x, min_y, max_x, max_y
- 已编制索引的几何图形的最小边界矩形 (MBR) 的坐标。(
min_x
,min_y
) 是西南坐标,(max_x
,max_y
) 是东北坐标。 info
- 列出从索引中排除的空间对象数量及其类型。
支持的数据类型
特权
任何有权访问 STV_*_Index 函数的用户都可以描述、重命名或删除由其他任何用户创建的索引。
建议
-
对跨多个节点的大型多边形表进行分段。通过表分段可以并行运行索引创建操作,从而充分利用 Vertica 中的大规模并行处理 (MPP) 架构。这会显著缩短大型表的执行时间。
对于需要构建索引的表,如果多边形总数较大,Vertica 建议对其进行分段。
-
STV_Create_Index 可能占用大量处理时间和内存。
首次为新数据编制索引时,Vertica 建议监视内存使用情况,以确保其保持在安全限制以内。内存使用情况取决于多边形数量、顶点数量以及多边形之间的重叠量。
-
STV_Create_Index 会在开始创建索引之前尝试分配内存。如果无法分配足够的内存,函数将会失败。如果没有足够的可用内存,请尝试以下解决方案:
-
在系统负载较小时创建索引。
-
避免并发创建索引。
-
尝试跨群集节点对输入表进行分段。
-
-
确保您计划索引的所有多边形都是有效的多边形。STV_Create_Index 和 STV_Refresh_Index 在构建索引时不检查多边形的有效性。
有关详细信息,请参阅创建或刷新索引之前确保多边形的有效性。
限制
-
12.0.x 版之前创建的任何索引都需要重新创建。
-
如果 WGS84 多边形的顶点位于国际日期变更线 (IDL) 或北极和南极,则索引创建失败。
-
索引名称中不允许使用反斜杠或制表符。
-
索引名称不能超过 110 个字符。
-
以下几何图形不包含在索引中:
-
非多边形
-
具有 NULL 标识符的几何图形
-
NULL 多边形(集合)
-
EMPTY 多边形(集合)
-
无效多边形(集合)
-
-
以下地形不包含在索引中:
- 带孔的多边形
- 跨越国际日期变更线的多边形
- 覆盖北极或南极的多边形
- 对跖多边形
使用提示
-
要取消运行 STV_Create_Index,请使用 Ctrl + C。
-
如果 Geometry 列没有有效的多边形,STV_Create_Index 将在 vertica.log 中报告错误并停止创建索引。
-
如果创建索引时使用了大量内存,请考虑对数据进行分段,以便并行创建索引。
示例
以下示例显示了 STV_Create_Index 的用法。
使用单个字面参数创建索引:
=> SELECT STV_Create_Index(1, ST_GeomFromText('POLYGON((0 0,0 15.2,3.9 15.2,3.9 0,0 0))')
USING PARAMETERS index='my_polygon') OVER();
polygons | SRID | min_x | min_y | max_x | max_y | info
----------+------+-------+-------+-------+-------+------
1 | 0 | 0 | 0 | 3.9 | 15.2 |
(1 row)
从表创建索引:
=> CREATE TABLE pols (gid INT, geom GEOMETRY(1000));
CREATE TABLE
=> COPY pols(gid, gx filler LONG VARCHAR, geom AS ST_GeomFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1|POLYGON((-31 74,8 70,8 50,-36 53,-31 74))
>> 2|POLYGON((-38 50,4 13,11 45,0 65,-38 50))
>> 3|POLYGON((10 20,15 60,20 45,46 15,10 20))
>> 4|POLYGON((5 20,9 30,20 45,36 35,5 20))
>> 5|POLYGON((12 23,9 30,20 45,36 35,37 67,45 80,50 20,12 23))
>> \.
=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index='my_polygons_1', overwrite=true,
max_mem_mb=256) OVER() FROM pols;
polygons | SRID | min_x | min_y | max_x | max_y | info
----------+------+-------+-------+-------+-------+------
5 | 0 | -38 | 13 | 50 | 80 |
(1 row)
从已分区的表并行创建索引:
=> CREATE TABLE pols (p INT, gid INT, geom GEOMETRY(1000)) SEGMENTED BY HASH(p) ALL NODES;
CREATE TABLE
=> COPY pols (p, gid, gx filler LONG VARCHAR, geom AS ST_GeomFromText(gx)) FROM stdin delimiter '|';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1|10|POLYGON((-31 74,8 70,8 50,-36 53,-31 74))
>> 1|11|POLYGON((-38 50,4 13,11 45,0 65,-38 50))
>> 3|12|POLYGON((-12 42,-12 42,27 48,14 26,-12 42))
>> \.
=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index='my_polygons', overwrite=true,
max_mem_mb=256) OVER() FROM pols;
polygons | SRID | min_x | min_y | max_x | max_y | info
----------+------+-------+-------+-------+-------+------
3 | 0 | -38 | 13 | 27 | 74 |
(1 row)