|
Требование: При использовании GUID в качестве агрегированных индексов с первичным ключом официально рекомендуется использовать упорядоченные GUID, поскольку неупорядоченные GUID могут привести к пустой трате места и, как следствие, к снижению эффективности чтения и записи, которая сильно снижается при фрагментации хранилища.
Напомним:
Фрагментация индексов для оптимизации производительности SQL Server h ttps:// www.itsvse.com/thread-9508-1-1.html
(MSSQL) Сравнение ключей int и guid в базе данных SQL Server h ttps:// www.itsvse.com/thread-10605-1-1.html Значения GUID в базе данных
Тип данных Global Unique Identifier (GUID) в SQL Server представлен типом данных uniqueidentifier, который хранит 16-байтовое двоичное значение. GUID - это двоичное число, основным использованием которого является идентификатор, который должен быть уникальным в сети с большим количеством компьютеров на многих сайтах.
И Guid, и SqlGuid имеют методы сравнения различных значений GUID. Реализация SqlGuid использует поведение SQL Server, при котором последние шесть байт значения являются наиболее значимыми.
Последовательные GUID по своей природе угадываемы, поэтому не используйте их в контекстах, чувствительных к безопасности.
Ссылка: https: //learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/comparing-guid-and-uniqueidentifier-values
Упорядоченные GUID в базах данных
В базах данных SQL Server есть функция NewSequentialId() для создания упорядоченных GUID, которая может быть установлена в качестве значения по умолчанию для поля типа GUID при создании таблицы и автоматически создает значение первичного ключа при вставке новых данных (эта функция может использоваться только в качестве значения по умолчанию для поля и не может быть вызвана непосредственно в SQL).
Пример:
Функция NewSequentialId() может использоваться только в базе данных, но в документации Microsoft MSDN есть описание, NEWSEQUENTIALID - это обертка вокруг функции Windows UuidCreateSequential.
Совет: не используйте эту функцию, если речь идет о конфиденциальности. Можно угадать значение следующего сгенерированного GUID и получить доступ к данным, связанным с этим GUID.
Ссылка: https: //learn.microsoft.com/zh-cn/previous-versions/sql/sql-server-2014/ms189786(v=sql.120)?redirectedfrom=MSDN h ttps:// learn.microsoft.com/zh-cn/sql/t-sql/functions/newsequentialid-transact-sql?view=sql-server-ver16
NET Создание последовательного GUID
Функция UuidCreateSequential полагается на вычислительное оборудование, и последние 12 бит метода на самом деле являются MAC-адресом сетевой карты.
Код выглядит следующим образом:
Результат следующий:
Недостатки:
- Использование этого метода требует DllImport для вызова библиотек классов Windows, поэтому он не является кроссплатформенным.
- Нельзя использовать в кластерных средах, где несколько машин пишут в одну и ту же базу данных, так как сгенерированные GUID будут отличаться друг от друга (функционально зависимое вычислительное оборудование), что приведет к фрагментации индекса.
- При перезапуске сервера Windows GUID могут начинаться с более низкого диапазона, что приводит к фрагментации индекса.
Ссылка:
h ttps:// learn.microsoft.com/zh-cn/windows/win32/api/rpcdce/nf-rpcdce-uuidcreatesequential h ttps:// learn.microsoft.com/zh-cn/archive/blogs/dbrowne/how-to-generate-sequential-guids-for-sql-server-in-net
Если вы используете приложение .NET для создания GUID, заказанных SQL SERVER, рекомендуется использовать библиотеку классов сторонних разработчиков: RT.Comb, команда nuget выглядит следующим образом:
Код выглядит следующим образом:
Результаты вывода:
Ссылка: https: //davecallan.com/generating-sequential-guids-which-sort-sql-server-in-net/
Фрагментация индексов первичного ключа с упорядоченным GUID и неупорядоченным GUID
Сначала создайте две таблицы с помощью следующего скрипта:
Протестируйте вставку 100 000 единиц данных с помощью следующего кода:
Результат теста выглядит следующим образом:
GUID | Потребление времени (мс) | Плотность сканирования (Scan Density) [Best Count: Actual Count], чем выше значение, тем лучше. | Фрагментация логического сканирования (Logical Scan Fragmentation), чем меньше значение, тем лучше. | Средняя плотность страниц (полная) (Avg. Page density (full)), чем выше значение, тем лучше. | Неупорядоченный GUID | 13367 | 12.58% [61:485] | 98.97% [61:485 | 63.66% [61:485] 98.97 | Упорядоченный GUID | 14139 | 100.00% [39:39] | 0.32% | 99.61% |
Тест снова вставил 1 миллион данных, неупорядоченный GUID потребление времени: 135203 миллисекунды, упорядоченный GUID потребление времени: 135134 миллисекунды. Потребление дискового пространства выглядит следующим образом:
неупорядоченный GUID: 36,547 МБ Упорядоченный GUID: 26,609 МБ
Ссылка: https: //learn.microsoft.com/zh-cn/sql/t-sql/database-console-commands/dbcc-showcontig-transact-sql?view=sql-server-ver16
(Окончание) |
Предыдущая статья: NET Core программа мультиязычного чтения и записи файлов ресурсов (.resx)Следующая: .NET/C# оптимизация памяти дискового файла для чтения потока
|