STV_Create_Index

对一组多边形创建空间索引,以加快与一组点的空间相交计算速度。

利用一个输入多边形集(可以是查询的结果),可以创建空间索引。空间索引是在全局命名空间中创建的。每当跨群集的节点对输入表或投影分段时,Vertica 会采用分布式计划。

OVER() 子句必须为空。

行为类型

不可变

语法

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)

另请参阅