diff --git a/content/zh/docs/Developerguide/CREATE-INDEX.md b/content/zh/docs/Developerguide/CREATE-INDEX.md index 9859f221001df054ce358a6590f4d66758285d91..64efeb5e2ec8a9fa9fd1be4b047868b8ff434300 100644 --- a/content/zh/docs/Developerguide/CREATE-INDEX.md +++ b/content/zh/docs/Developerguide/CREATE-INDEX.md @@ -17,7 +17,7 @@ - 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。 - 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。 -- 在分区表上创建唯一索引时,索引项中必须包含分布列和所有分区键。 +- 分区表索引分为LOCAL索引与GLOBAL索引,LOCAL索引与某个具体分区绑定,而GLOBAL索引则对应整个分区表。 - 列存表支持的PSORT和B-tree索引都不支持创建表达式索引、部分索引和唯一索引。 - 列存表支持的GIN索引支持创建表达式索引,但表达式不能包含空分词、空列和多列,不支持创建部分索引和唯一索引。 @@ -38,7 +38,7 @@ ``` CREATE [ UNIQUE ] INDEX [ [schema_name.]index_name ] ON table_name [ USING method ] ( {{ column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] }[, ...] ) - LOCAL [ ( { PARTITION index_partition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] + [ LOCAL [ ( { PARTITION index_partition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] | GLOBAL ] [ WITH ( { storage_parameter = value } [, ...] ) ] [ TABLESPACE tablespace_name ]; ``` @@ -46,13 +46,13 @@ ## 参数说明 -- **UNIQUE** +- **UNIQUE** 创建唯一性索引,每次添加数据时检测表中是否有重复值。如果插入或更新的值会引起重复的记录时,将导致一个错误。 目前只有行存表B-tree索引支持唯一索引。 -- **CONCURRENTLY** +- **CONCURRENTLY** 以不阻塞DML的方式创建索引(加ShareUpdateExclusiveLock锁)。创建索引时,一般会阻塞其他语句对该索引所依赖表的访问。加此关键字,可实现创建过程中不阻塞DML。 @@ -62,25 +62,25 @@ 列存表和分区表不支持CONCURRENTLY方式创建索引。 -- **schema\_name** +- **schema\_name** 模式的名称。 取值范围:已存在模式名。 -- **index\_name** +- **index\_name** 要创建的索引名,索引的模式与表相同。 取值范围:字符串,要符合标识符的命名规范。 -- **table\_name** +- **table\_name** 需要为其创建索引的表的名称,可以用模式修饰。 取值范围:已存在的表名。 -- **USING method** +- **USING method** 指定创建索引的方法。 @@ -96,13 +96,13 @@ >![](public_sys-resources/icon-note.gif) **说明:** >列存表对GIN索引支持仅限于对于tsvector类型的支持,即创建列存GIN索引入参需要为to\_tsvector函数(的返回值)。此方法为GIN索引比较普遍的使用方式。 -- **column\_name** +- **column\_name** 表中需要创建索引的列的名称(字段名)。 如果索引方式支持多字段索引,可以声明多个字段。最多可以声明32个字段。 -- **expression** +- **expression** 创建一个基于该表的一个或多个字段的表达式索引,通常必须写在圆括弧中。如果表达式有函数调用的形式,圆括弧可以省略。 @@ -110,31 +110,39 @@ 在创建表达式索引时,如果表达式中包含IS NULL子句,则这种索引是无效的。此时,建议用户尝试创建一个部分索引。 -- **COLLATE collation** +- **COLLATE collation** COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。 -- **opclass** +- **opclass** 操作符类的名称。对于索引的每一列可以指定一个操作符类,操作符类标识了索引那一列的使用的操作符。例如一个B-tree索引在一个四字节整数上可以使用int4\_ops;这个操作符类包括四字节整数的比较函数。实际上对于列上的数据类型默认的操作符类是足够用的。操作符类主要用于一些有多种排序的数据。例如,用户想按照绝对值或者实数部分排序一个复数。能通过定义两个操作符类然后当建立索引时选择合适的类。 -- **ASC** +- **ASC** 指定按升序排序 (默认)。 -- **DESC** +- **DESC** 指定按降序排序。 -- **NULLS FIRST** +- **NULLS FIRST** 指定空值在排序中排在非空值之前,当指定DESC排序时,本选项为默认的。 -- **NULLS LAST** +- **NULLS LAST** 指定空值在排序中排在非空值之后,未指定DESC排序时,本选项为默认的。 -- **WITH \( \{storage\_parameter = value\} \[, ... \] \)** +- **LOCAL** + + 指定创建的分区索引为LOCAL索引。 + +- **GLOBAL** + + 指定创建的分区索引为GLOBAL索引,当不指定LOCAL、GLOBAL关键字时,默认创建GLOBAL索引。 + +- **WITH \( \{storage\_parameter = value\} \[, ... \] \)** 指定索引方法的存储参数。 @@ -165,30 +173,32 @@ 默认值:gin\_pending\_list\_limit的默认取决于GUC中gin\_pending\_list\_limit的值(默认为4MB) -- **TABLESPACE tablespace\_name** +- **TABLESPACE tablespace\_name** 指定索引的表空间,如果没有声明则使用默认的表空间。 取值范围:已存在的表空间名。 -- **WHERE predicate** +- **WHERE predicate** 创建一个部分索引。部分索引是一个只包含表的一部分记录的索引,通常是该表中比其他部分数据更有用的部分。例如,有一个表,表里包含已记账和未记账的定单,未记账的定单只占表的一小部分而且这部分是最常用的部分,此时就可以通过只在未记账部分创建一个索引来改善性能。另外一个可能的用途是使用带有UNIQUE的WHERE强制一个表的某个子集的唯一性。 取值范围:predicate表达式只能引用表的字段,它可以使用所有字段,而不仅是被索引的字段。目前,子查询和聚集表达式不能出现在WHERE子句里。 -- **PARTITION index\_partition\_name** +- **PARTITION index\_partition\_name** 索引分区的名称。 取值范围:字符串,要符合标识符的命名规范。 -- **TABLESPACE index\_partition\_tablespace** +- **TABLESPACE index\_partition\_tablespace** 索引分区的表空间。 取值范围:如果没有声明,将使用分区表索引的表空间index\_tablespace。 + + ## 示例 @@ -274,6 +284,12 @@ postgres=# CREATE INDEX ds_customer_address_p1_index2 ON tpcds.customer_address_ ) TABLESPACE example2; +--创建GLOBAL分区索引 +postgres=CREATE INDEX ds_customer_address_p1_index3 ON tpcds.customer_address_p1(CA_ADDRESS_ID) GLOBAL; + +--不指定关键字,默认创建GLOBAL分区索引 +postgres=CREATE INDEX ds_customer_address_p1_index4 ON tpcds.customer_address_p1(CA_ADDRESS_ID); + --修改分区表索引CA_ADDRESS_SK_index2的表空间为example1。 postgres=# ALTER INDEX tpcds.ds_customer_address_p1_index2 MOVE PARTITION CA_ADDRESS_SK_index2 TABLESPACE example1; @@ -306,7 +322,7 @@ CREATE INDEX ## 优化建议 -- create index +- create index 建议仅在匹配如下条件之一时创建索引: @@ -318,7 +334,12 @@ CREATE INDEX 约束限制: - 分区表上不支持创建部分索引、不支持NULL FIRST特性。 - - - 在分区表上创建唯一索引时,索引项中必须包含分布列和所有分区键。 + - 在使用LOCAL索引创建唯一索引时,索引项中必须包含分布列和所有分区键。GLOBAL索引无此约束。 + - 分区表创建GLOBAL索引时,存在以下约束条件: + - 不支持表达式索引、部分索引 + - 不支持列存表 + - 仅支持B-tree索引 + - 在相同属性列上,分区LOCAL索引与GLOBAL索引不能共存。 + - 如果在一个分区表上创建了GLOBAL索引,当执行ALTER TABLE对分区进行DROP、TRUNCATE、SPLIT、MERGE、EXCHANGE中的任何一种操作,此时会导致GLOBAL索引失效,需要用户手动重新创建索引。 diff --git a/content/zh/docs/Developerguide/PG_CLASS.md b/content/zh/docs/Developerguide/PG_CLASS.md index e72d05ee7f3aaa7cd9be58c647122b993da9c700..2ff55120573bd8964c616b94911b0d9fc3c8d70c 100644 --- a/content/zh/docs/Developerguide/PG_CLASS.md +++ b/content/zh/docs/Developerguide/PG_CLASS.md @@ -168,7 +168,7 @@ PG\_CLASS系统表存储数据库对象信息及其之间的关系。

"char"

- +

relnatts

diff --git a/content/zh/docs/Developerguide/PG_CONSTRAINT.md b/content/zh/docs/Developerguide/PG_CONSTRAINT.md index e2e0140b0b819a701bad0ffc26e3a6bceb4fcdbf..5a3ce7be39e4c1eedf33315477096de99ee16c13 100644 --- a/content/zh/docs/Developerguide/PG_CONSTRAINT.md +++ b/content/zh/docs/Developerguide/PG_CONSTRAINT.md @@ -159,7 +159,13 @@ PG\_CONSTRAINT系统表存储表上的检查约束、主键和唯一约束。

如果是表约束,则是约束控制的字段列表。

-

confkey

+

conincluding

+ +

smallint[]

+ +

不用做约束,但是会包含在INDEX中的属性列。

+ +

confkey

smallint[]

diff --git a/content/zh/docs/Developerguide/PG_INDEX.md b/content/zh/docs/Developerguide/PG_INDEX.md index 827c6781eca4c282a86fbd782c025fb492bfe287..0702c390e179fcb043ad8c240b36d79a7d120522 100644 --- a/content/zh/docs/Developerguide/PG_INDEX.md +++ b/content/zh/docs/Developerguide/PG_INDEX.md @@ -33,8 +33,14 @@ PG\_INDEX系统表存储索引的一部分信息,其他的信息大多数在PG

索引中的字段数目。

- -

indisunique

+

indnkeyatts

+ +

smallint

+ +

索引中作为KEY字段的数目。

+ +

indisunique

+

Boolean

diff --git "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\347\264\242\345\274\225.md" "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\347\264\242\345\274\225.md" index 07ca3391f6ff5705db1e3ab7cea7d11660904212..29c88e620dcf1dc6ed69c85b7ca6ea697a4192fc 100644 --- "a/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\347\264\242\345\274\225.md" +++ "b/content/zh/docs/Developerguide/\345\210\233\345\273\272\345\222\214\347\256\241\347\220\206\347\264\242\345\274\225.md" @@ -16,14 +16,15 @@ >![](public_sys-resources/icon-note.gif) **说明:** >- 索引创建成功后,系统会自动判断何时引用索引。当系统认为使用索引比顺序扫描更快时,就会使用索引。 >- 索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷。因此请定期删除无用的索引。 + >- 分区表索引分为LOCAL索引与GLOBAL索引,一个LOCAL索引对应一个具体分区,而GLOBAL索引则对应整个分区表。 ## 操作步骤 创建分区表的步骤请参考[创建和管理分区表](创建和管理分区表.md)。 -- 创建索引 - - 创建分区表索引tpcds\_web\_returns\_p2\_index1,不指定索引分区的名称。 +- 创建索引 + - 创建分区表LOCAL索引tpcds\_web\_returns\_p2\_index1,不指定索引分区的名称。 ``` CREATE INDEX tpcds_web_returns_p2_index1 ON tpcds.web_returns_p2 (ca_address_id) LOCAL; @@ -35,7 +36,7 @@ CREATE INDEX ``` - - 创建分区索引tpcds\_web\_returns\_p2\_index2,并指定索引分区的名称。 + - 创建分区表LOCAL索引tpcds\_web\_returns\_p2\_index2,并指定索引分区的名称。 ``` CREATE INDEX tpcds_web_returns_p2_index2 ON tpcds.web_returns_p2 (ca_address_sk) LOCAL @@ -57,8 +58,14 @@ CREATE INDEX ``` + - 创建分区表GLOBAL索引tpcds_web_returns_p2_global_index。 + + ``` + CREATE INDEX tpcds_web_returns_p2_global_index ON tpcds.web_returns_p2 (ca_street_number) GLOBAL; + ``` + +- 修改索引分区的表空间 -- 修改索引分区的表空间 - 修改索引分区_web\_returns\_p2\_P2\_index_的表空间为example1。 ``` @@ -102,7 +109,7 @@ - 执行如下命令查询系统和用户定义的所有索引。 ``` - SELECT RELNAME FROM PG_CLASS WHERE RELKIND='i'; + SELECT RELNAME FROM PG_CLASS WHERE RELKIND='i' or RELKIND='I'; ``` - 执行如下命令查询指定索引的信息。