Fra*_* R. 5 index clustered-index informix
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);
Run Code Online (Sandbox Code Playgroud)
{###}
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);
Run Code Online (Sandbox Code Playgroud)
{###}
UPDATE STATISTICS;
Run Code Online (Sandbox Code Playgroud)
我的理解是,集群索引本质上与对加载文件进行预排序、将其插入表中并为外键列创建索引相同。
我创建了两个表,每个表都加载了 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 机制是没有意义的;最好使用聚集索引,因为这样更容易管理操作。