架构师_程序员_码农网

Имя пользователя Получить пароль
Регистрация

QQ登录

Всего один шаг, чтобы начать

Поиск
Просмотров:1739|Ответов: 3
打印 上一主题 下一主题

[Данные][MSSQL] SQL SERVER Упорядоченный GUID и неупорядоченный GUID как первичный ключ агрегированный индекс Тесты

[Копировать ссылку] [MSSQL] SQL SERVER Упорядоченный GUID и неупорядоченный GUID как первичный ключ агрегированный индекс тест
Поднимайте прямо на 跳转到指定楼层
владелец
发表于 2023-6-8 21:12:26|只看该作者回帖奖励|Реверсивныйпросмотр|Режим чтения
Требование: При использовании 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# оптимизация памяти дискового файла для чтения потока
Первый - использовать ту же модель, что и в предыдущем случае, а второй - использовать ту же модель, что и в предыдущем случае.
sofabed
владелец|Posted on 2024-1-27 11:07:12|Видеть только этого автора
ABP создает упорядоченный GUID для базы данных sql server со следующим исходным кодом:



Код фермерской сети, опубликован только в процессе практики, возникли технические трудности, не вводите в заблуждение других.
сапоги угги продажа
BENCHSET
楼主|发表于 2024-3-24 11:43:45|只看该作者
EF Core генерирует упорядоченный код GUID:





h ttps:// learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.valuegeneration.sequentialguidvaluegenerator?view= efcore-8.0

Код фермерской сети, публикуется только в процессе практики, возникли технические трудности, не вводите в заблуждение других.
сапоги угги продажа
напольное покрытие
楼主|发表于 2024-4-11 15:00:11|只看该作者
Код фермерский сетевой, публикуется только в процессе практики, возникли технические трудности, не вводите в заблуждение других.
Вы должны войти в систему, прежде чем сможете отправлять сообщения назад Войти | Зарегистрироваться

Эта версия интегральных правил


DISCLAIMER: Все программное обеспечение, материалы по программированию или статьи, опубликованные Code Farmer, предназначены только для использования в учебных и исследовательских целях; вышеуказанное содержимое не должно использоваться в коммерческих или незаконных целях, в противном случае все последствия будут возложены на самих пользователей. Это сайт информации из сети, спор об авторских правах не имеет никакого отношения к этому сайту. Вы должны полностью удалить вышеуказанное содержимое со своего компьютера в течение 24 часов после загрузки. Если вам понравилась программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшее подлинное обслуживание. Если есть какие-либо нарушения, пожалуйста, свяжитесь с нами по электронной почте, чтобы разобраться с этим.

Почта To:help@itsvse.com

QQ| ( 鲁ICP备14021824号-2)|Sitemap

GMT+8, 2024-9-19 06:15

Быстрый ответНазад к началуНазад к списку