Я использую 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.