Como você pode criar índices em cluster com o Fluent NHibernate?

Eu estou usando Fluent-NHibernate (com automapping) para gerar minhas tabelas, mas gostaria de escolher um índice de cluster diferente do que o campo ID que é usado por padrão. Como você pode criar índices clusterizados com o Fluent NHibernate em um campo diferente do campo Chave Primária padrão?

O principal raciocínio por trás disso é simples. Estou usando o Guids para meus campos de chave primária. Por padrão, o NHibernate cria índices agrupados nos campos de chave primária. Como os Guids geralmente não são sequenciais, o agrupamento no campo de chave primária causa um problema de desempenho.

Como todos sabemos, anexar registros no final de uma tabela é uma operação muito mais barata do que inserir registros na tabela. Além disso, os registros na tabela são fisicamente armazenados na ordem dos itens no índice clusterizado. Como os Guids são um pouco "aleatórios" e não são sequenciais, podem ser gerados novos Guids que sejam menores que o valor de outros Guids de IDs já presentes na tabela - resultando em inserções de tabela em vez de anexos.

Para minimizar isso, eu tenho uma coluna chamada CreatedOn que é do tipo DateTime. Preciso que a tabela seja armazenada em cluster nessa coluna CreatedOn para que todos os novos registros sejam anexados em vez de inseridos.

Qualquer idéia de como fazer isso é bem vinda !!!

Nota: Eu percebo que eu poderia usar Guias Seqüenciais, mas prefiro não seguir esse caminho por razões de segurança.

Nota: Eu ainda não tenho uma resposta para este post, mas tenho algumas idéias que estou pensando no momento.

Usando o NHibernate sem o Fluent, acho que é possível criar índices clusterizados diretamente no NHibernate. Eu ainda não sei o suficiente sobre o NHibernate para saber como fazer isso. Eu sou apenas bonita (como em quase absoluta) certeza de que isso pode ser feito.

O Fluent-NHibernate costumava incluir uma maneira de definir atributos (por exemplo, um índice clusterizado) em um objeto SQL antes da reescrita recente. Agora essa opção parece ter ido embora. Provavelmente vou postar uma pergunta em algum lugar para ver se essa opção ainda está disponível. Se assim for, provavelmente eu poderia usar isso para definir o índice clusterizado.

Fluent-NHibernate fornece a capacidade de expor uma configuração para edição manual, uma vez que tenha sido construída fluentemente. Eu não tentei essa funcionalidade, mas espero que possa oferecer o nível de granularidade que é necessário para definir índices clusterizados.

Na pior das hipóteses, posso escrever um script SQL para alterar os índices clusterizados em todas as minhas tabelas, uma vez geradas. No entanto, tenho algumas perguntas sobre essa abordagem. A. Como estou usando a geração automática de esquema, o NHibernate "desfaz" meu índice clusterizado muda na próxima vez que ele avaliar a configuração? 2. O erro do NHibernate se detectar que o índice clusterizado foi alterado? Eu preciso testar isso, mas ainda não o fiz. Eu realmente odeio essa solução embora. Eu estou testando meu banco de dados contra SQLServer2008 e MySQL. Parte da beleza do NHibernate é que ele é independente de banco de dados. Uma vez que introduzimos scripts, todas as apostas estão desativadas.

Existe uma interface que é usada em convenções fluentes chamadas IPropertyInstance Classes que herdam dessa interface possuem uma propriedade Index que permite que um índice seja criado no campo. O problema é que não há sinalizador ou outra opção para permitir que o índice seja criado como clusterizado. A solução mais simples seria adicionar uma propriedade a esse método para permitir a criação de índices em cluster. Acho que posso sugerir isso para os desenvolvedores do Fluent-NHibernate.

questionAnswers(4)

yourAnswerToTheQuestion