文章
姚 鑫 · 九月 3, 2021 阅读大约需 3 分钟

第五章 SQL命令 BUILD INDEX

第五章 SQL命令 BUILD INDEX

用数据填充一个或多个索引。

大纲

BUILD INDEX [%NOLOCK] [%NOJOURN] FOR TABLE table-name [INDEX index-name [,index-name]]

BUILD INDEX [%NOLOCK] [%NOJOURN] FOR SCHEMA schema-name

BUILD INDEX [%NOLOCK] [%NOJOURN] FOR ALL

参数

  • FOR TABLE table-name - 已存在表的名称。
    表名可以是限定的(schema.table),也可以是非限定的(table)。
    非限定表名接受默认模式名。
    • INDEX index-name - 可选—索引名称或以逗号分隔的索引名称列表。
      如果指定,则只构建这些索引。
      如果未指定,将构建为表定义的所有索引。
    • FOR SCHEMA schema-name - 现有模式的名称。
      此命令为指定模式中的所有表构建所有索引。

描述

BUILD INDEX提供了三种语法形式来构建/重新构建所有已定义的索引:
- Table: BUILD INDEX FOR TABLE table-name. 可选的INDEX子句允许仅构建/重新构建指定的索引。
- 模式中的所有表:BUILD INDEX FOR schema schema-name
- 当前命名空间中的所有表:BUILD INDEX FOR All

可能出于以下任何原因希望构建索引:
- 已经使用CREATE INDEX向已经包含数据的表添加了一个或多个索引。
- 已经使用%NOINDEX选项对表执行了INSERTUPDATEDELETE操作,而不是接受将每个操作写入索引的性能开销。

在这两种情况下,都可以使用BUILD INDEX用数据填充这些索引。

BUILD INDEX将修改的表的数量作为受影响的行数返回。

权限

BUILD INDEX命令是一个特权操作。
用户必须具有%BUILD_INDEX管理权限才能执行BUILD INDEX
如果不这样做,会出现一个带有%msgSQLCODE -99错误,User 'name' does not have %BUILD_INDEX privileges
如果拥有适当的授予权限,可以使用GRANT命令将%BUILD_INDEX权限分配给用户或角色。
管理权限是特定于名称空间的。

用户必须对指定的表具有SELECT权限。
如果用户是该表的Owner(创建者),则自动授予该用户对该表的SELECT权限。
否则,用户必须被授予该表的SELECT权限。

  • 在指定的表上执行BUILD INDEX FOR TABLE而没有SELECT权限将导致SQLCODE -30错误,并且%msg Table 'name' not found
  • 发出BUILD INDEX FOR SCHEMA只会为用户具有SELECT权限的表构建索引。
    如果用户对模式中的任何表都没有SELECT权限,则该命令完成时不会出现错误,不会影响0行。

可以通过调用%CHECKPRIV命令来确定当前用户是否具有SELECT权限。
可以使用GRANT命令为指定的表分配SELECT权限。

锁和日志

默认情况下,BUILD INDEX语句会在构建索引之前获取每个表的范围锁。这可以防止其他进程修改表的数据。该锁在BUILD INDEX操作结束时自动释放。可以指定%NOLOCK来防止表锁定。

默认情况下,BUILD INDEX语句使用当前进程的日志记录设置。可以指定% NOJOURN来阻止日志记录。

错误代码

  • 如果指定的表名不存在, IRIS会发出一个SQLCODE -30错误并将%msg设置为 Table 'sample.tname' does not exist。如果指定的是视图而不是表,或者指定的表没有SELECT权限,则会返回此错误消息。
  • 如果指定的索引名不存在,IRIS会发出SQLCODE -400错误并将%msg设置为ERROR #5066: Index name 'sample.tname::badindex' is invalid
  • 如果指定的索引名不存在,IRIS会发出SQLCODE -400错误并将%msg设置为Schema 'sample' not found
0
0 19
讨论 (0)1
登录或注册以继续