среда, 17 сентября 2014 г.

MS SQL использование GUID как первичных ключей (Primary key)

Проблема

В двух словах: планирую новый проект на MS SQL
планируется распределенная структура (несколько баз)
соовтетсвенно в очередной раз возник вопрос: какими должны быть ключевые поля
Int или GUID
(предметно-зависимые отбросил сразу, т.к. на практике ни к чему хорошему не приводило)

распределенная структура располагает с GUID-ключам
но в общем случае при использовании GUID  в лоб появляеются проблемы с производительностью.

Обзор "лучших практик" привел к решению
Последовательные или комбинированные (COMB) гуиды
COMB от NHibernate
или на уровне БД - NEWSEQUENTIALID

все ссылки по тексту ниже.

Разделил их на 4 раздела

1. Базовые знания
2. Исследование вопроса GUID-ов
3. Варианты решений
4. (факультатив) связь с Entity Framework

1. Базовая подготовка по MS SQL / Guid


GUID - вики статья
(вдруг кто не знает)
http://ru.wikipedia.org/wiki/GUID


Описание типа данных uniqueidentifier в MS SQL
Использование данных uniqueidentifier
http://technet.microsoft.com/ru-ru/library/ms190215(v=sql.105).aspx

Функция NEWSEQUENTIALID (Transact-SQL)
описание функции в MS SQL
http://msdn.microsoft.com/ru-ru/library/ms189786.aspx

UuidCreateSequential function
http://msdn.microsoft.com/en-us/library/aa379322(VS.85).aspx

2. Статьи очерчивающие проблемы использвания GUID'ов для первичных ключей


Хорошая статья с замерами
GUID vs INT Debate
http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/guid-vs-int-debate.aspx

Простенькая статья с замерами
Целочисленные, символьные и GUID-ключи в MS SQL
http://www.arbinada.com/main/node/38

Обсуждение отличий в скорости работы обычных гуидов и последовательных
What are the performance improvement of Sequential Guid over standard Guid?
http://stackoverflow.com/questions/170346/what-are-the-performance-improvement-of-sequential-guid-over-standard-guid/170363#170363

Статья отценивающая за и проив гуидов как первичных ключей
есть расчеты и самодельная генерация комбинированных гуидов на стооне сервера.
в двух словах: автор - за комбогуиды
The Cost of GUIDs as Primary Keys
http://www.informit.com/articles/article.aspx?p=25862

Еще статья оценивающая, хорошо ли брать гуиды в качестве первичных ключей
SQL Server: Is it OK to use a uniqueidentifier (GUID) as a Primary Key?
http://mitch-wheat.blogspot.com.au/2011/08/sql-server-is-it-ok-to-use.html

еще обсуждение на Stackoverflow
Про издержки в производительности при использовании гуидов
What are the performance improvement of Sequential Guid over standard Guid?
http://stackoverflow.com/questions/170346/what-are-the-performance-improvement-of-sequential-guid-over-standard-guid/170363#170363

3. Статьи с вариантами решения

Это решение взял за основу
CombGuid. Генерация “дружественных” к SQL серверам значений Guid в .net приложениях
пример самостоятельной генерации (тут логика взята из библиотеки Magnum)
http://habrahabr.ru/post/214667/

Собственно NHibernate'овская реализация Гуидов
(по нему сделано много комбовских реализаций)
https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Id/GuidCombGenerator.cs

Хорошая статья - чуть не взял её за основу
но склонился к NHibernate'овской реализации.
она учитывает 2 аспекта
1. использование функции uuidcreatesequential
2. превращение функции с SQL-server-совместимый формат
http://www.shirmanov.com/2010/05/generating-newsequentialid-compatible.html
Generating NewSequentialID compatible Sequential Guids in C#

обсуждение на stackoverflow
Ищут .NET эквивалент для newsequentialid
Is there a .NET equalent to SQL Servers newsequentialid()
http://stackoverflow.com/questions/211498/is-there-a-net-equalent-to-sql-servers-newsequentialid
тут дали ссылку на PInvoke.net (см. ниже)
но еще есть пример реализации COMB от NHibernate

pinvoke.net
пример адаптации для Net Windows функции uuidcreatesequential (rpcrt4)
http://www.pinvoke.net/default.aspx/rpcrt4.uuidcreatesequential
это годный рабочий пример, но не уверен в дружественности сгенерированных гуидов к MS SQL

еще пример
по сути дублирует код с pinvoke.net
http://www.csharpque.com/2012/06/generating-sequential-guid.html

Немного про взаимодействие с EF


Using sequential guids as identifiers in Entity Framework
http://bartwullems.blogspot.com/2013/10/using-sequential-guids-as-identifiers.html
тут описаны 2 варианта
1. генерация гуида через скл-сервер
2. ссылка на нхибернейтовсую реализацию Comb

Статьи по теме

Пример создания последовательного Guid в базе
MS SQL: Создание нового последовательного Guid


Комментариев нет:

Отправить комментарий