GUID против последовательного GUID
Типичным примером является использование Guid в качестве PK для таблиц, но, как указано в других обсуждениях (см. Преимущества и недостатки ключей базы данных GUID / UUID )
Есть некоторые проблемы с производительностью.
Это типичная последовательность Guid
f3818d69-2552-40b7-a403-01a6db4552f7
7ce31615-fafb-42c4-b317-40d21a6a3c60
94732fc7-768e-4cf2-9107-f0953f6795a5
Проблемы такого рода данных: << br />
-
- Широкое распределение значений
- Почти случайные единицы
- Использование индекса очень, очень, очень плохо
- много движется листьев
- Почти каждый ПК должен быть как минимум
по некластерному индексу
- Проблема возникает как в Oracle, так и
SQL Server
Возможное решение - использовать последовательный гид, который генерируется следующим образом:
cc6466f7-1066-11dd-acb6-005056c00008
cc6466f8-1066-11dd-acb6-005056c00008
cc6466f9-1066-11dd-acb6-005056c00008
Как их сгенерировать из кода C #:
[DllImport("rpcrt4.dll", SetLastError = true)]
static extern int UuidCreateSequential(out Guid guid);
public static Guid SequentialGuid()
{
const int RPC_S_OK = 0;
Guid g;
if (UuidCreateSequential(out g) != RPC_S_OK)
return Guid.NewGuid();
else
return g;
}
Преимущества
- Лучшее использование индекса
- Разрешить использование кластерных ключей
проверено в сценариях NLB)
- Меньше использования диска
- 20-25% прироста производительности при
минимальная стоимость
Измерение в реальной жизни:
Сценарий:
- Guid хранится как UniqueIdentifier
типы на SQL Server
- Guid хранится как CHAR (36) в Oracle
- Лот операций вставки в пакетном режиме
вместе в одной транзакции
- От 1 до 100 сек вкладышей в зависимости
на столе
- Некоторые таблицы> 10 миллионов строк
Лабораторный тест - SQL Server
Тест VS2008, 10 одновременных пользователей, без обдумывания, процесс тестирования с 600 вставками в пакете для конечного стола
Стандартный гид
Avg. Продолжительность процесса: 10,5 сек
Avg. Запрос второй: 54,6
Avg. Соответственно Время: 0,26
последовательный гид
Avg. Продолжительность процесса: 4,6 сек
Avg. Запрос второй: 87,1
Avg. Соответственно Время: 0,12
Результаты по Oracle (извините, другой инструмент, используемый для теста) 1.327.613 вставить на стол с Guid PK
Стандартный гид , 0,02 сек. истекшее время для каждой вставки, 2,861 сек. процессорного времени, всего 31,049 сек. истекшее
Последовательный гид , 0,00 сек. Истекшее время для каждой вставки, 1,142 сек. процессорного времени, всего 3,667 сек. истекшее
Время ожидания последовательного чтения файла БД прошло с 6,4 миллионов событий ожидания для 62,415 секунд до 1,2 миллионов событий ожидания для 11,063 секунд.
Важно понимать, что все последовательные руководства могут быть угаданы, поэтому не стоит использовать их, если безопасность вызывает беспокойство, все еще используя стандартный guid.
Короче говоря ... если вы используете Guid в качестве PK, используйте последовательный guid каждый раз, когда они не передаются назад и вперед от пользовательского интерфейса, они ускорят работу и ничего не будут стоить для реализации.