2009-07-20 4 views
11

Джимми Нильссон обсуждает свою концепцию COMB guid here. Эта концепция популярна в NHibernate, среди других кругов, для предполагаемого значения производительности по сравнению с стандартными идентификаторами GUID, которые, как правило, намного более случайны.Показатели эффективности команд COMB

Однако при тестировании это, похоже, не так. Я что-то упускаю?

Тестовый пример:

У меня есть таблица называется темп (а не временная таблица, только таблица с именем «Темп») с 585000 строками в нем. У меня есть новая таблица под названием «Коды» и вы хотите скопировать все 585 000 значений кода из таблицы temp в таблицу кодов. Тест SQL я выполнил был:

set statistics time on; 

truncate table codes; 
DBCC DBREINDEX ('codes', '', 90); 

insert into codes (codeid, codevalue) 
select newid(), codevalue from temp 

truncate table codes; 
DBCC DBREINDEX ('codes', '', 90); 

insert into codes (codeid, codevalue) 
select CAST(CAST(NEWID() AS BINARY(10)) + CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER), codevalue from temp 

Производительность со стандартными значениями GUID:

SQL Execution сервера Times: CPU время = 17250 мс, затраченное время = 15735 мс.

(585000 строк (ы) пострадавших)

Производительность со значениями GUID COMB:

SQL-сервера Выполнение Время: Процессор время = 17500 мс, затраченное время = 16419 мс.

(585000 строк (ы) пострадавших)

Что мне не хватает? Значения COMB GUID привели к чуть более продолжительным временам, по-видимому, из-за дополнительных преобразований. Я думал, что нужно сократить время вставки, полуприведя GUIDS, используя дату для последних 6 байтов, но прирост производительности не существует.

+0

ли мой или любой ответ удовлетворить ваш вопрос? – gbn

+0

@ Крис: Правильно ли gbn? – jgauffin

ответ

5

Во-вторых, вы увидите различия только тогда, когда у вас есть индексы (PK, FK или другие типы индексов, сгруппированные или не сгруппированные) в столбце Guid, поскольку стоимость стандартного guid или newguid или comb guid обусловлена высокая стоимость переупорядочивания индексных данных каждый раз, когда выполняется вставка.

Смотрите мой вопрос, в котором я подкреплять это с некоторыми реальными данными жизни как от SQL Server и Oracle: StackOverFlow Question

С уважением Массимо

14

Я бы предположил, что вы не видите преимущества заказа, потому что в целевой таблице нет ПК. Итак, это накладные расходы на конвертацию, которые вы видите. Если он имеет PK, строки 585k все равно должны быть отсортированы на вставке. Как SQL знает, что он полусортирован?

Теперь, если это было 5,850 x 100 строк вставки, то вы можете увидеть некоторые преимущества, потому что новые строки будут «в конце», а не «посередине», что уменьшит разбиение страниц и накладные расходы.

Я бы пошел дальше и скажу, что статья датирована 2002 годом и предназначена для SQL 2000, и ее охватила реальная жизнь.

В SQL Server 2005 у нас есть SEQUENTIAL GUID, чтобы разрешать строго монотонные GUID для решения некоторых проблем. GUID как PK также был сделан здесь: недавний пример: INT vs Unique-Identifier for ID field in database с сторонними ссылками.

Если ORM диктует идентификатор GUID как ПК, а не натуральный ключ или стандартный суррогатный ключ на основе int, это серьезное ограничение ORM. И случай хвоста клиента виляет собака базы данных.

-2

Ваш код для генерации новых идентификаторов GUID неправильный. Для каждой строки создается совершенно другое число (для каждой строки вы вызываете NEWID()). Вам нужно сохранить большую часть идентификатора GUID.

+0

CodeId - это ключ для таблицы, поэтому он обязательно должен быть другим. Если вы рассматриваете руководство COMB, то вам нужно, чтобы первая часть была случайной для предотвращения коллизий клавиш для вставок, которые находятся в пределах разрешения таймера (что составляет 300 мс или около того?). Порядок сортировки SQL-сортировки сначала проходит по последним 6 элементам, поэтому, имея в качестве возрастающего числа, сгенерированного из datetime, сохраняется порядок записей в индекс. –

Смежные вопросы