CREATE INDEX
功能描述
在指定的表上创建一个索引。索引可以用来提高数据库查询性能,但是不恰当的使用将导致性能下降。
注意事项
- CLOB、BlOB和IMAGE类型的字段上不能创建索引。
- 执行该语句的用户需要有CREATE INDEX、CREATE ANY INDEX系统权限,普通用户不可以创建系统用户对象。
- 组合索引字段不超过16个,字段长度累加不超过3900字节,以类型最大长度为准。
- 只能分区表创建分区索引。分区索引数与分区表数需一致,否则会报错。
- 支持创建upper/to_char函数索引,约束条件是函数的参数只能是一列,并且不支持把函数索引转成约束。
- 数据库重启回滚期间不支持该操作。
语法格式
CREATE [ UNIQUE ] INDEX [IF NOT EXISTS ] [ schema_name. ]index_name ON table_index_clause [ CRMODE { PAGE | ROW } ]
- table_index_clause 子句:
[ schema_name. ]table_name ( { [function_name()]column_name [ ASC | DESC ] } [ ,... ] ) index_attributes
- index_attributes 子句:
[ [ physical_attributes_clause ] [ TABLESPACE {tablespace_name} ] [index_partitioning_clauses] [ ONLINE ] ]
- physical_attributes_clause 子句:
INITRANS integer
- index_partitioning_clauses 子句:
LOCAL [ ( { PARTITION partition_name [ TABLESPACE tablespace_name ] [ INITRANS integer ] [ PCTFREE integer ] } [ , ... ] ) ]
参数说明
- UNIQUE
创建唯一性索引,每次添加数据时检测表中是否有重复值。如果插入或更新的值会导致重复的记录时将生成一个错误。
目前只有B-tree支持唯一索引。
- IF NOT EXISTS
创建索引时,如果索引已经存在,不做改动,直接返回成功。如果索引不存在,则创建新索引。
- [schema_name.]
模式名,与表的模式名相同,可省略。
- index_name
要创建的索引名。
- table_name
要创建索引的表名,可以有用户修饰。
- function_name()
创建函数索引的函数名称。
- column_name
表的列名(字段名)。
- ASC
指定按升序排序 (默认)。
- DESC
指定按降序排序。
目前只支持升序建索引,DESC也是升序。
- INITRANS
索引事务初始大小。
1-255。
- TABLESPACE tablespace_name
指定索引的表空间,如果没有声明则使用默认的表空间。
- index_partitioning_clauses
分区表局部索引。
- LOCAL
LOCAL是分区索引(本地索引),就是在所有每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用。
- PCTFREE
必须保留的最小空间的比例,单位是百分比%,取值范围是 [8-80]。在索引创建时为索引块留下的剩余空间,这个剩余空间可以用来插入新的索引项。
- ONLINE
在线创建索引。
普通创建索引作为DDL操作,会对表加排他锁,从而阻塞表上并发的UPDATE/DELETE/INSERT操作,影响系统表事务吞吐量,在线创建索引和在线重建索引功能旨在创建索引和重建索引过程中,对表加共享锁(仅在开始和结束阶段短暂地加排他锁),允许UPDATE/DELETE/INSERT操作并发执行,从而不影响在线业务的执行。
- CRMODE { PAGE | ROW }
指定该索引的CR_MODE,不指定时默认和表的CR_MODE配置保持一致。
- CRMODE PAGE指定为页级MVCC模式。
- CRMODE ROW指定为行级MVCC模式。
示例
- 在普通表posts上在线创建索引。
--删除表posts。 DROP TABLE IF EXISTS posts;
--创建普通表posts。 CREATE TABLE posts(post_id CHAR(2) NOT NULL, post_name CHAR(6) PRIMARY KEY, basic_wage INT, basic_bonus INT);
--创建索引idx_posts。 CREATE INDEX idx_posts ON posts(post_id ASC, post_name) ONLINE;
- 在分区表education上创建分区索引。
--删除表education。 DROP TABLE IF EXISTS education;
--创建分区表education。 CREATE TABLE education(staff_id INT NOT NULL, higest_degree CHAR(8), graduate_school VARCHAR(64), graduate_date DATETIME, education_note VARCHAR(70)) PARTITION BY LIST(higest_degree) ( PARTITION doctor VALUES ('博士'), PARTITION master VALUES ('硕士'), PARTITION undergraduate VALUES ('学士') );
--向表education中插入记录1。 INSERT INTO education(staff_id,higest_degree,graduate_school,graduate_date,education_note) VALUES(10,'博士','西安电子科技大学','2017-07-06 12:00:00','211'); --向表education中插入记录2。 INSERT INTO education(staff_id,higest_degree,graduate_school,graduate_date,education_note) VALUES(11,'博士','西北农林科技大学','2017-07-06 12:00:00','211和985'); --向表education中插入记录3。 INSERT INTO education(staff_id,higest_degree,graduate_school,graduate_date,education_note) VALUES(12,'硕士','西北工业大学','2017-07-06 12:00:00','211和985'); --向表education中插入记录4。 INSERT INTO education(staff_id,higest_degree,graduate_school,graduate_date,education_note) VALUES(15,'学士','西安建筑科技大学','2017-07-06 12:00:00','非211和985'); --向表education中插入记录5。 INSERT INTO education(staff_id,higest_degree,graduate_school,graduate_date,education_note) VALUES(18,'硕士','西安理工大学','2017-07-06 12:00:00','非211和985'); --向表education中插入记录6。 INSERT INTO education(staff_id,higest_degree,graduate_school,graduate_date,education_note) VALUES(20,'学士','北京师范大学','2017-07-06 12:00:00','211和985'); --提交事务。 COMMIT;
--创建分区索引。 CREATE INDEX idx_training ON education(staff_id ASC, higest_degree) LOCAL (PARTITION doctor, PARTITION master, PARTITION undergraduate); --创建函数索引。 CREATE INDEX idx_func ON education(upper(graduate_school)); CREATE INDEX idx_func_1 ON education(to_char(staff_id));
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论