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;
Entendo que um índice de cluster é essencialmente o mesmo que pré-classificar o arquivo de carregamento, inseri-lo na tabela e criar o índice para a coluna de chave estrangeira.
Criei duas tabelas, cada uma carregada com 2 milhões de linhas de dados idênticos, pré-classificados pela chave estrangeira. No entanto, uma tabela possui um índice de cluster em fk_id, a outra tabela com um índice não clusterizado em fk_id.
Existe alguma diferença na estrutura da árvore ou sobrecarga adicional em manter ou acessar dados de uma tabela com um índice de cluster em comparação com a mesma tabela/dados com um índice sem cluster?
A ordem em que você insere os dados em uma tabela não garante a ordem dos dados neste disco.
Mesmo que a ordem seja como você deseja, ela não está estruturada de forma que o otimizador saiba que é pesquisável por essa ordem. (Será tratado como não ordenado.)
Quando você tem um índice não clusterizado e precisa usar campos não cobertos pelo próprio índice, o índice contém apenas um ponteiro para os dados. Isso é semelhante à introdução de uma junção extra; uma etapa rápida, mas uma etapa extra definitiva no carregamento desses dados.
Resumindo, quase sempre deve ser vantajoso ter um índice agrupado (exceto em circunstâncias como inserir dados repetidamente em posições aleatórias na tabela) .
O que é contrário à sua experiência...
Então, quais são as consultas que você está executando? Pode ser que algo contra-intuitivo esteja acontecendo, mas ainda pode ser explicável.
Em um banco de dados Informix, não há muita diferença entre a tabela e o índice criado ao carregar uma tabela vazia em ordem pré-classificada e criar um índice clusterizado na tabela na mesma ordem. Assim, o resultado líquido é basicamente o mesmo. Além disso, não há implicações de longo prazo para nenhum dos métodos; O Informix não mantém o índice clusterizado em ordem após a operação inicial de clustering. O benefício de desempenho de um índice clusterizado com Informix é um efeito de segunda ordem; há um pequeno benefício ao selecionar os dados na ordem agrupada, mas não é um grande benefício.
No entanto, existem vantagens práticas consideráveis em usar
CREATE [UNIQUE] CLUSTER INDEX <idxname> ON <tablename>(<columnlist>)
ou usarALTER INDEX <idxname> TO CLUSTER
. Isso inclui o fato de que você não precisa descartar a tabela (e, assim, destruir as visualizações selecionadas na tabela ou perder as permissões concedidas na tabela - embora eu suponha que você possa fazer uma exclusão completa da tabela ou até mesmo truncar a tabela, em vez disso de descartar a tabela), e você não precisa armazenar explicitamente os dados em um arquivo e economiza o custo de transferir os dados do DBMS para o aplicativo para salvar os dados e o custo de transferir os dados do aplicativo de volta ao DBMS ao recriar (recarregar) a tabela.Então, a menos que haja motivos para querer uma cópia dos dados fora do banco de dados, não adianta usar o mecanismo UNLOAD e LOAD; é melhor usar um índice clusterizado porque é mais fácil gerenciar a operação dessa maneira.