使用与表相同的分布方案对索引进行分段

在创建的索引使用了与对表所用的相同的分段表达式时,使用与对表所用的相同分布方案来对索引进行分段。

数据库服务器基于表达式树的等价性来确定分段表达式是否相同,而不是基于代数等价性。 例如:考虑以下两个表达式:
(col1 >= 5)
(col1 = 5 OR col1 > 5)

尽管这两个表达式在代数上是等价的,但它们不是相同的表达式。

使用与对表所用的相同的分布方案对索引进行分段的示例

假设您用以下 SQL 语句创建两个分段表和索引:
CREATE TABLE tb1 (a INT)
   FRAGMENT BY EXPRESSION
            (a <= 10) IN tabdbspc1,
            (a <= 20) IN tabdbspc2,
            (a <= 30) IN tabdbspc3;
CREATE INDEX idx1 ON tb1 (a)
   FRAGMENT BY EXPRESSION
            (a <= 10) IN idxdbspc1,
            (a <= 20) IN idxdbspc2,
            (a <= 30) IN idxdbspc3;

CREATE TABLE tb2 (a INT CHECK a> 30 AND a<= 40)
      IN tabdbspc4;
CREATE INDEX idx2 ON tb2(a) 
      IN idxdbspc4;
假设您接着用以下简单 SQL 语句将表 tb2 附加到表 tb1
ALTER FRAGMENT ON TABLE tb1 
      ATTACH tb2 AS (a <= 40);
出于以下原因,数据库服务器可以为该连接操作消除索引 idx1 的重建:
  • 索引 idx1 的分段存储表达式与表 tb1 的分段存储表达式完全相同。数据库服务器会:
    • 将索引 idx1 的分段存储扩展到 数据库空间 idxdbspc4
    • 将索引 idx2 转换为索引 idx1 的分段
  • 由于 CHECK 约束与产生的附加表的分段存储表达式相同,因而没有任何行将从一个分段迁移到其他分段。

    有关如何确保现有表分段和新表分段之间不发生数据移动的更多信息,请参阅确保在连接分段时不发生数据移动