Informix 11.70.TC4DE:
CREATE TABLE cluster_tbl
(
fk_id INT,
data CHAR(2048)
);
LOAD FROM "presorted.ld" INSERT INTO cluster_tbl;
CREATE UNIQUE CLUSTER INDEX cl_idx ON cluster_tbl(fk_id);
{###}
CREATE TABLE noncluster_tbl
(
fk_id INT,
data CHAR(2048)
);
LOAD FROM "presorted.ld" INSERT INTO noncluster_tbl;
CREATE UNIQUE INDEX ncl_idx ON noncluster_tbl(fk_id);
{###}
UPDATE STATISTICS;
据我了解,聚簇索引本质上与对加载文件进行预排序、将其插入表中并为外键列创建索引是相同的。
我创建了两个表,每个表加载了 200 万行相同的数据,由外键预先排序。但是,一个表在 fk_id 上有一个聚簇索引,另一个表在 fk_id 上有一个非聚簇索引。
与具有非聚簇索引的相同表/数据相比,在维护或访问具有聚簇索引的表中的数据时,树结构或额外开销是否有任何差异?
您将数据插入表中的顺序并不能保证该磁盘上数据的顺序。
即使顺序恰好如您所愿,它的结构也不是优化器知道它可以按该顺序搜索的方式。 (它将被视为未订购。)
当你有一个非聚集索引,并且你需要使用索引本身没有覆盖的字段时,索引只包含一个指向数据的指针。这类似于引入额外的连接;一个快速的,但是加载数据的一个明确的额外步骤。
简而言之,聚集索引几乎总是有利的(除了在表中的随机位置重复插入数据的情况)。
这与你的经验相反......
那么,您正在运行的查询是什么?可能发生了一些违反直觉的事情,但它仍然可以解释。
在 Informix 数据库中,按预先排序的顺序加载空表创建的表和索引与按相同顺序在表上创建聚集索引之间没有太大区别。因此,最终结果基本相同。此外,这两种方法都没有长期影响;在初始集群操作之后,Informix 不会按顺序维护集群索引。Informix 的聚簇索引带来的性能优势是二阶效应;当您以聚簇顺序选择数据时会有一点好处,但这并不是很大的好处。
CREATE [UNIQUE] CLUSTER INDEX <idxname> ON <tablename>(<columnlist>)
但是,使用或使用.有相当大的实际优势ALTER INDEX <idxname> TO CLUSTER
。这些包括您不必删除表(从而破坏从表中选择的视图,或丢失表上授予的权限)这一事实——尽管我想您可以执行全表删除,甚至截断表,而不是删除表),并且您不必显式地将数据存储在文件中,并且节省了将数据从 DBMS 传输到应用程序以保存数据的成本以及从应用程序传输数据的成本重新创建(重新加载)表时返回到 DBMS。因此,除非有理由需要数据库外部的数据副本,否则没有必要使用 UNLOAD 和 LOAD 机制;您最好使用聚簇索引,因为这样更容易管理操作。