Вимоги: При використанні 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
Посилання:Вхід за гіперпосиланням видно.
(Кінець)
|