相应索引不存在时的情境示例

表没有可充当所生成索引的分段的列索引时,数据库服务器估计构建列的索引分段的成本,将此成本与重新构建生成表的所有分段的整个索引相比,而选择成本较少的索引构建。

假设您用以下 SQL 语句创建分段表和索引:
CREATE TABLE tb1(a int, b int) 
   FRAGMENT BY EXPRESSION
            (a >=0 AND a < 5) IN db1,
            (a >=5 AND a <10) IN db2;
CREATE INDEX idx1 ON tb1(a);
假设您接着又创建两个未分段的表,然后决定将它们附加到前面的分段表。
CREATE TABLE tb2 (a int, b int, 
   CHECK (a >=10 and a<15)) IN db3; 
CREATE INDEX idx2 ON tb2(a) IN db3; 
CREATE TABLE tb3 (a int, b int, 
   CHECK (a >= 15 and a<20)) IN db4; 
CREATE INDEX idx3 ON tb3(b) IN db4; 

ALTER FRAGMENT ON TABLE tb1 
   ATTACH tb2 AS (a >= 10 and a<15) tb3 AS (a >= 15 and a<20);

三个 CREATE INDEX 语句自动计算 HIGH 方式中每个索引的主列的分布统计信息,以及 LOW 方式的索引统计信息和表统计信息。

唯一需要 UPDATE STATISTICS LOW FOR TABLE 语句的时间是在某个情境的 CREATE INDEX 语句之后,在该情境中表具有其他预先存在的索引,如此示例中所示:
CREATE TABLE tb1(col1 int, col2 int); 
CREATE INDEX index idx1 on tb1(col1); 
    (equivalent to update stats low on table tb1) 
LOAD from tb1.unl insert into tb1; (load some data) 
CREATE INDEX idx2 on tb1(col2); 

由于 CREATE INDEX 语句不更新名称为 idx1 的预先存在索引的索引级别统计信息,因而语句 CREATE INDEX idx2 on tb1(col2) 不完全等同于 UPDATE STATISTICS LOW FOR TABLE tb1

在上述示例中,表 tb3 没有 对列 a 的索引,该索引 可以作为所生成索引 idx1 的分段。 数据库服务器估计对已用完的表 tb3 的列 a 建立索引分段的成本,并将此成本与为合成表上的所有分段重建整个索引的成本相比较。 数据库服务器会选择成本较小的索引建立。