云数据库 GAUSSDB-CREATE INDEX:注意事项

时间:2024-11-12 09:17:45

注意事项

  • 基表为HASH分布时,若创建不包含基表分布键的主键或唯一索引,需要使用全局二级索引(CREATE GLOBAL INDEX),若创建包含基表分布键的主键或唯一索引,需要使用普通索引(CREATE INDEX),单DN部署形式下,使用全局二级索引或者普通索引均可创建成功;当基表为除HASH分布以外的其他分布形式时,主键或唯一索引只能使用普通索引(CREATE INDEX),即索引键必须包含基表分布键。
  • 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。
  • 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。
  • 被授予CREATE ANY INDEX权限的用户,可以在public模式和用户模式下创建索引。
  • 如果表达式索引中调用的是用户自定义函数,按照函数创建者权限执行表达式索引函数。
  • 不支持XML类型数据作为普通索引、UNIQUE索引、GLOBAL索引、LOCAL索引、部分索引。
  • 在线创建索引的类型只支持btree索引和ubtree索引,。索引创建形式只支持非分区表普通索引及分区表GLOBAL索引、LOCAL索引,不支持在线索引字段增删改、PCR ubtree索引、二级分区与GSI。在线并行创建索引只支持Astore的普通索引、GLOBAL索引、LOCAL索引,Ustore索引不支持在线并行创建。
  • 使用CREATE INDEX创建索引可能会改变表的访问方式,从而导致查询执行计划改变。
  • 在创建组合索引时,需根据查询条件和组合索引最左匹配原则创建。
    • 组合索引最左匹配原则:如果查询条件包含了组合索引的一列或者多列,那么组合索引的最左边开始的连续列需要与查询条件匹配上。
    • 当查询为where a = ?, b = ?,c = ?, d = ? 或者 where a = ?, b = ?,c = ? 等时,都是最佳的索引匹配;当查询为where b = ?,c = ?, d = ? 或者 where c = ?, d = ? 等时,在代价计算后可能也会走索引idx_test_abcd,但是这种情况走索引时会扫描索引的全部页面,导致SQL性能并不理想。类似情况建议根据最左匹配原则创建适合此查询条件的组合索引。
      --创建表test。
      gaussdb=# CREATE TABLE test(a int, b int, c int, d int, e int, f text);
      创建组合索引。
      gaussdb=# CREATE INDEX idx_test_abcd ON test(a,b,c,d);
support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0523.html