Как вы можете создавать кластерные индексы с помощью Fluent NHibernate?

Я использую Fluent-NHibernate (с автоматическим отображением) для генерации моих таблиц, но хотел бы выбрать другой кластеризованный индекс, чем поле идентификатора, которое используется по умолчанию. Как вы можете создавать кластерные индексы с помощью Fluent NHibernate для поля, отличного от поля первичного ключа по умолчанию?

Основная причина этого проста. Я использую Guids для моих полей первичного ключа. По умолчанию NHibernate создает кластерные индексы в полях первичного ключа. Поскольку направляющие обычно не являются последовательными, кластеризация в поле первичного ключа вызывает проблемы с производительностью.

Как мы все знаем, добавление записей в конец таблицы является гораздо более дешевой операцией, чем вставка записей в таблицу. Кроме того, записи в таблице физически хранятся в порядке элементов в кластерном индексе. Поскольку направляющие являются «случайными» и не последовательными, могут создаваться новые направляющие, которые меньше значений других направляющих идентификаторов, уже находящихся в таблице, что приводит к вставке, а не добавлению в таблицу.

Чтобы минимизировать это, у меня есть столбец с именем CreatedOn, который имеет тип DateTime. Мне нужно, чтобы таблица была кластеризована в этом столбце CreatedOn, чтобы все новые записи добавлялись, а не вставлялись.

Любые идеи о том, как этого добиться, приветствуются !!!

Примечание: я понимаю, что могу использовать последовательные руководства, но предпочитаю не идти по этому пути из соображений безопасности.

Примечание: у меня до сих пор нет ответа на этот пост, но у меня есть несколько идей, которые я обдумываю в данный момент.

Используя NHibernate без Fluent, я думаю, что возможно создать кластерные индексы непосредственно в NHibernate. Я еще недостаточно знаю о NHibernate, чтобы знать, как это сделать. Я просто довольно (как в почти абсолютно) уверен, что это может быть сделано.

Fluent-NHibernate используется для включения способа установки атрибутов (например, кластеризованного индекса) в объекте SQL перед последним переписыванием. Теперь эта опция, кажется, исчезла. Я, вероятно, опубликую вопрос где-нибудь, чтобы увидеть, доступна ли эта опция. Если это так, я мог бы использовать это для установки кластеризованного индекса.

Fluent-NHibernate предоставляет возможность выставить конфигурацию для ручного редактирования, как только она будет свободно создана. Я не пробовал эту функцию, но ожидаю, что она может предложить уровень детализации, необходимый для установки кластерных индексов.

В худшем случае я могу написать сценарий SQL для изменения кластеризованных индексов на всех моих таблицах после их создания. Однако у меня есть пара вопросов относительно этого подхода. О. Поскольку я использую автоматическую генерацию схемы, будет ли NHibernate "отменять" мой кластерный индекс, когда он будет в следующий раз оценивать конфигурацию? 2. Будет ли ошибка NHibernate, если он обнаружит, что кластерный индекс был изменен? Я должен проверить это, но пока не сделал этого. Я действительно ненавижу это решение, хотя. Я тестирую свою БД против SQLServer2008 и MySQL. Частью красоты NHibernate является то, что он не зависит от базы данных. Как только мы представим сценарии, все ставки отменены.

Существует интерфейс, который используется в свободных соглашениях, называемых классами IPropertyInstance, которые наследуются от этого интерфейса, имеют свойство Index, которое позволяет создавать индекс на поле. Проблема заключается в том, что нет флага или другого параметра, позволяющего создать индекс как кластеризованный. Простейшим решением было бы добавить свойство к этому методу, чтобы можно было создавать кластерные индексы. Я думаю, что могу предложить это разработчикам Fluent-NHibernate.

Ответы на вопрос(4)

Ваш ответ на вопрос