Требования: При использовании GUID в качестве первичных индексов агрегации ключей рекомендуется использовать упорядоченные GUID, поскольку неупорядоченные GUID приведут к потере места и, как следствие, снижению эффективности чтения и записи.
Обзор:
Значение GUID базы данных
Глобальные типы данных Unique Identifier (GUID) в SQL Server представлены типами данныхуникальный идентификатор, который хранит 16-байтное бинарное значение. GUID — это двоичное число, основная функция которого — быть идентификатором, который должен быть уникальным в сети с множеством компьютеров на различных сайтах.
И Guid, и SqlGuid имеют способы сравнивать разные значения GUID. Реализация SqlGuid использует поведение SQL Server,Последние шесть байт значения — самые важные。
Последовательные GUID по своей природе предсказуемы, поэтому не используйте их в контекстах, связанных с безопасностью。
Ссылка:Вход по гиперссылке виден.
База данных упорядочена GUID
В базе данных SQL Server есть такойNewSequentialId()для создания упорядочённого GUID. При создании таблицы вы можете установить её как значение по умолчанию для поля типа GUID и автоматически создать значение первичного ключа при вставке новых данных (эта функция может использоваться только как значение поля по умолчанию, а не вызывается напрямую в SQL).
Пример:
Функция NewSequentialId() может использоваться только в базах данных, хотя в документации Microsoft по MSDN указано, что NEWSEQUENTIALID является обёрткой для функции Windows UuidCreateSequential.
Совет: не используйте эту функцию, если это вопрос конфиденциальности. Потому чтоМожно угадать значение следующего сгенерированного GUIDчтобы получить доступ к данным, связанным с этим GUID.
Ссылка:Вход по гиперссылке виден.
Вход по гиперссылке виден.
.NET создаёт упорядоченный GUID
Функция UuidCreateSequential зависит от вычислительного оборудования методаПоследние 12 бит — это на самом деле MAC-адрес сетевой карты。
Код таков:
Результаты следующие:
Недостаток:
- Для этого метода требуется DllImport для вызова библиотеки Windows, поэтому он не является кроссплатформенным.
- Он не может использоваться в кластерной среде, где несколько машин записывают данные в одну базу данных, поскольку полученные GUID будут отличаться друг от друга (функционально-зависящее оборудование), что приводит к фрагментации индексов.
- Если ваш сервер Windows перезапускается, GUID может начаться с более низкого диапазона, что приведёт к фрагментации индекса.
Ссылка:
Вход по гиперссылке виден.
Вход по гиперссылке виден.
Если вы используете .NET-программу для создания GUID, упорядоченной в SQL SERVER, рекомендуется использовать стороннюю библиотеку классов:RT. Гребень, команда Nuget выглядит следующим образом:
Код таков:
Выпуск:
Ссылка:Вход по гиперссылке виден.
Упорядоченные и неупорядоченные фрагменты первичного ключа GUID
Начните с создания двух таблиц по следующему сценарию:
Тест вставляет 100 000 элементов данных, и код выглядит следующим образом:
Результаты теста следующие:
| GUID | Потраченное время (ms) | Плотность сканирования [Лучший счёт: фактический счёт], чем выше значение, тем лучше | Логическая фрагментация сканирования — чем ниже значение, тем лучше | Средняя плотность страниц (полная) (средняя плотность страниц. Плотность страницы (полная), чем выше значение, тем лучше | | Неупорядоченный GUID | 13367 | 12.58% [61:485] | 98.97% | 63.66% | | Заказ GUID | 14139 | 100.00% [39:39] | 0.32% | 99.61% |
Тест снова вставляет 1 миллион элементов данных, при этом GUID в непорядке занимает 135203 мс, а ординированный GUID — 135134 мс. Вместимость складских помещений следующая:
Неупорядоченный GUID: 36.547 MB Заказанный GUID: 26.609 MB
Ссылка:Вход по гиперссылке виден.
(Конец)
|