第五章 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
选项对表执行了INSERT
、UPDATE
或DELETE
操作,而不是接受将每个操作写入索引的性能开销。
在这两种情况下,都可以使用BUILD INDEX
用数据填充这些索引。
BUILD INDEX
将修改的表的数量作为受影响的行数返回。
权限
BUILD INDEX
命令是一个特权操作。
用户必须具有%BUILD_INDEX
管理权限才能执行BUILD INDEX
。
如果不这样做,会出现一个带有%msg
的SQLCODE -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
。