Использование uuid в качестве первичного ключа для таблиц имеет множество преимуществ, одним из которых является возможность получать идентификаторы для создаваемых в клиентском приложении объектов самостоятельно, без обращения к серверу баз данных. Но использование uuid в качестве первичного ключа имеет и недостаток: guid-ы, сгенерированные клиентским приложением, могут быть недостаточно “дружелюбны” к SQL серверу, что в свою очередь может привести к оверхеду при добавлении новой записи. Возможное удорожание операции insert вытекает из того, что SQL сервер для хранения таблиц, по которым задан первичный ключ, обычно использует структуры известные как b-деревья. При добавлении новой записи в таблицу, SQL сервер, в соответствии с сортировкой по первичному ключу, ищет лист, на котором должна быть размещена вставляемая запись. Учитывая псевдослучайный алгоритм генерации uuid, сортировочный порядок новой записи также случаен и возможна ситуация, что лист, на котором должна быть размещена запись, полностью заполнен. В подобных случаях SQL серверу приходится разделять лист надвое и перестраивать ветви b-дерева, ведущие к этому листу. Чтобы не сталкивать SQL сервер с необходимостью постоянно перестраивать кластерный индекс при добавлении новых записей, можно вести генерацию значений первичного ключа в нарастающей последовательности. Один из вариантов генерации Guid в нарастающем порядке — это привязывать сортировочный порядок сгенерированного Guid к текущему времени. Сгенерированные подобным образом идентификаторы часто называют CombGuid, намекая на то, что строятся они из двух половинок — псевдослучайной части, как у обычных Guid, и строки, привязанной ко времени.
Читать полностью »
Метка «nhibernate»
CombGuid. Генерация “дружественных” к SQL серверам значений Guid в .net приложениях
2014-03-04 в 17:43, admin, рубрики: .net, Magnum, nhibernate, Программирование, метки: Magnum, nhibernateВышел NHibernate 3.3.3.GA
2013-03-17 в 22:31, admin, рубрики: .net, nhibernate, orm, метки: nhibernate, ormВсем привет. Буквально несколько минут назад мы выпустили NHibernate 3.3.3.GA. Забрать можно с sf.net или установить с помощью менеджера пакетов NuGet.
Это минорный релиз, но кроме исправления багов и недочетов мы приготовили немного вкусного. Читать полностью »
Разработка механизма извлечения DTO из БД с помощью LINQ
2013-03-14 в 13:59, admin, рубрики: .net, dto, expression trees, linq, nhibernate, Песочница, метки: c++, dto, expression trees, linq, nhibernateПостановка задачи
В этой статье я опишу механизм создания DTO, реализованный в одном из проектов нашей компании. Проект состоит из серверной части и нескольких клиентов (Silverlight, Outlook, iPad). Сервер представляет собой ряд сервисов, реализованных на WCF. Раз есть сервисы, то надо обмениваться с ними какими-то данными. Вариант, когда клиенты знают о сущностях доменной области и получают их с сервера, отпал сразу по ряду причин:
- Не все клиенты реализованы на .NET
- Возможные проблемы сериализации сложных графов объектов
- Избыточность передаваемых данных
В принципе, все эти недостатки давно известны и для их устранения умные люди придумали паттерн Data Transfer Object (DTO). То есть, классы сущностей доменной области известны только серверу, клиенты же оперируют классами DTO и экземплярами этих же классов обмениваются с сервисами. В теории все прекрасно, на практике же среди прочих возникают вопросы создания DTO и записи в них данных из сущностей. В небольших проектах с этой работой отлично справится оператор "=". Но, когда размер проекта начинает расти и повышаются требования к производительности и сопровождаемости кода, возникает необходимость в более гибком решении. Ниже я опишу эволюцию механизма, который мы используем для создания и заполнения DTO.
Читать полностью »
NHibernate: маленькая хитрость при работе с Oracle или PostgreSQL
2012-07-09 в 19:15, admin, рубрики: .net, hibernate, nhibernate, oracle, postgresql, tips, метки: hibernate, nhibernate, oracle, postgresql, tipsВ ADO.NET провайдерах для Oracle, PostgreSQL и, возможно, других есть одна неприятная особенность, которая может сказаться на производительности вашего приложения, если вы запрашиваете у сервера большие объемы данных: они не кэшируют вызовы метода IDataReader.GetOrdinal. Как оказалось это очень критично для NHibernate, но, к счастью, разработчики NHibernate (а точнее Hibernate) эту проблему заметили и уже решили.
Но эта фича осталась незамеченной и почти не задокументированной.
Читать полностью »