Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
Вот пишут: Creates a GUID that is greater than any GUID previously generated by this function on a specified computer since Windows was started. After restarting Windows, the GUID can start again from a lower range, but is still globally unique. When a GUID column is used as a row identifier, using NEWSEQUENTIALID can be faster than using the NEWID function. This is because the NEWID function causes random activity and uses fewer cached data pages. Using NEWSEQUENTIALID also helps to completely fill the data and index pages. т.е. после рестарта новый сгенерированный гуид уже не будет больше последнего сгенерированного до рестарта? Сообщение было отредактировано: 14 окт 13, 12:34 |
14 окт 13, 12:33 [14966058] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13147 |
а вы, простите, гуиды сравниваете на больше / меньше? имхо тут важно что они последовательно монотонны |
14 окт 13, 12:50 [14966249] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
я не сравниваю, фраза сумщает. А разве "последовательно монотонны" не предполагает сравнение? |
||
14 окт 13, 12:51 [14966262] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13147 |
2 Winnipuh для гуидов? мне как-то в голову не проходило, честно )) ну поправили распределение и хорошо. а как поправили - глобально или только для процесса / стейтмента / батча - я не копал сильно, да и не вижу смысла я и обычные identity страх как не люблю сравнивать, уж лучше getdate() с уточнением (не более того) по identity а тут - гуиды. фу-фу-фу ![]() |
14 окт 13, 13:13 [14966488] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
По-моему, даже 2 последовательных инсерта в одну таблицу не гаратируют, что более поздний инсерт сгенерирует бо'льшие значения |
||
14 окт 13, 13:15 [14966502] Ответить | Цитировать Сообщить модератору |
NEWSEQUENTIALID()
Guest |
вы натыкались на подобное поведение это функции? в bol-е пишут обратное
|
||||||
14 окт 13, 13:28 [14966589] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
declare @t table(id int, f1 uniqueidentifier default newid(), f2 uniqueidentifier default NEWSEQUENTIALID() ) insert @t(id) select id from sysobjects select * from @t order by f2 Запустил 2 раза Получил 2 диапазона 61325FD0-AF34-E311-B211-FC4DD42EDCAD -- B2325FD0-AF34-E311-B211-FC4DD42EDCAD 813315DB-AF34-E311-B211-FC4DD42EDCAD -- D23315DB-AF34-E311-B211-FC4DD42EDCAD По-моему, 813315DB-AF34-E311-B211-FC4DD42EDCAD из 2го диапазона все же "меньше", чем B2325FD0-AF34-E311-B211-FC4DD42EDCAD из 1го |
14 окт 13, 13:31 [14966619] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
ну так речь о спец. гуидах, майкрософт утверждает, что при вызовах этой функции идет возрастающая последовательность, что важно для кластерных индексов. Мало того, они еще замечают, что мол, если вы используете seq. гуиды в важных таблицах будьте начеку - ведь можно легко прогнозировать следующие значения и крэкнуть к идрени фене ваши данные ![]() |
||
14 окт 13, 13:33 [14966631] Ответить | Цитировать Сообщить модератору |
NEWSEQUENTIALID()
Guest |
действительно, в "строковом" представлении диапазоны пересекаются, у меня получились 5A7FA7D8-B334-E311-8BCE-E61F1352270B - 9F7FA7D8-B334-E311-8BCE-E61F1352270B 2E42EFE6-B334-E311-8BCE-E61F1352270B - 7342EFE6-B334-E311-8BCE-E61F1352270B но если эти 4 giud-a отсортировать, то видно монотонное возрастание, а если посмотреть на них в binary, становиться ясно почему, байты в первых трёх частях хранятся в обратно порядке select *, CAST (id as binary(16)) from ( select cast('5A7FA7D8-B334-E311-8BCE-E61F1352270B' as uniqueidentifier) as id union all select cast('9F7FA7D8-B334-E311-8BCE-E61F1352270B' as uniqueidentifier) union all select cast('2E42EFE6-B334-E311-8BCE-E61F1352270B' as uniqueidentifier) union all select cast('7342EFE6-B334-E311-8BCE-E61F1352270B' as uniqueidentifier) ) a order by id 5A7FA7D8-B334-E311-8BCE-E61F1352270B 0xD8A77F5A34B311E38BCEE61F1352270B 9F7FA7D8-B334-E311-8BCE-E61F1352270B 0xD8A77F9F34B311E38BCEE61F1352270B 2E42EFE6-B334-E311-8BCE-E61F1352270B 0xE6EF422E34B311E38BCEE61F1352270B 7342EFE6-B334-E311-8BCE-E61F1352270B 0xE6EF427334B311E38BCEE61F1352270B |
||
14 окт 13, 13:45 [14966714] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
не совсем понятно... declare @g table(u uniqueidentifier) insert into @g (u) select '61325FD0-AF34-E311-B211-FC4DD42EDCAD' union all select 'B2325FD0-AF34-E311-B211-FC4DD42EDCAD' union all select '813315DB-AF34-E311-B211-FC4DD42EDCAD' union all select 'D23315DB-AF34-E311-B211-FC4DD42EDCAD' select * from @g order by u -------------- 61325FD0-AF34-E311-B211-FC4DD42EDCAD B2325FD0-AF34-E311-B211-FC4DD42EDCAD 813315DB-AF34-E311-B211-FC4DD42EDCAD D23315DB-AF34-E311-B211-FC4DD42EDCAD |
||
14 окт 13, 13:47 [14966739] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вот именно, что непонятно, как вы сравниваете на больше/меньше declare @g table(u uniqueidentifier, a varbinary(50)) insert into @g (u, a) select '61325FD0-AF34-E311-B211-FC4DD42EDCAD', 0x61325FD0 union all select 'B2325FD0-AF34-E311-B211-FC4DD42EDCAD', 0xB2325FD0 union all select '813315DB-AF34-E311-B211-FC4DD42EDCAD', 0x813315DB union all select 'D23315DB-AF34-E311-B211-FC4DD42EDCAD', 0xD23315DB select * from @g order by a |
||
14 окт 13, 13:51 [14966782] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
я сравниваю??? ![]() Майкрософт сравнивает, я всего лишь использовал ORDER BY. |
||||
14 окт 13, 13:55 [14966816] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
ну да. Вы же поставили order by u. Значит у вас есть критерии, почему одно значение больше/меньше другого. Я, например, отбросил повторяющуюся часть. |
||
14 окт 13, 13:57 [14966827] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
речь идет про гуиды, а не про varbinary. и функция NEWSEQUENTIALID() выдает последовательность гуидов, а не чего-то другого. Другой вопрос, что ваше представление разошлось с тем, как это реализовано MS, вы видимо думали, что они тоже будут преобразовывать в честные двоичные значения? |
||||
14 окт 13, 13:59 [14966850] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
"отбросил" и преобразовал в бинарную форму? зачем? см. мой предыдущий пост. |
||||
14 окт 13, 14:00 [14966857] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
The uniqueidentifier data type stores 16-byte binary values |
||
14 окт 13, 14:01 [14966871] Ответить | Цитировать Сообщить модератору |
NEWSEQUENTIALID()
Guest |
это не говорит о том, что храниться должно в том же виде, что и отображается. |
||||
14 окт 13, 14:06 [14966908] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
и что из этого следует? еще раз ваши значения, в которых вы усомнились declare @g table(u uniqueidentifier) insert into @g (u) select '61325FD0-AF34-E311-B211-FC4DD42EDCAD' union all select 'B2325FD0-AF34-E311-B211-FC4DD42EDCAD' union all select '813315DB-AF34-E311-B211-FC4DD42EDCAD' union all select 'D23315DB-AF34-E311-B211-FC4DD42EDCAD' select * from @g order by u -------------- 61325FD0-AF34-E311-B211-FC4DD42EDCAD B2325FD0-AF34-E311-B211-FC4DD42EDCAD 813315DB-AF34-E311-B211-FC4DD42EDCAD D23315DB-AF34-E311-B211-FC4DD42EDCAD SQL Server (заметьте, не я!) отсортировал их как UNIQUEIDENTIFIER, все сработало правильно. Последовательность возрастающая. Зачем что-то куда-то преобразовывать? |
||||
14 окт 13, 14:07 [14966918] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
In general, equality comparisons make a lot of sense with uniqueidentifier values. However, if you find yourself needing general ordering, then you might be looking at the wrong data type and should consider various integer types instead. If, after careful thought, you decide to order on a uniqueidentifier column, you might be surprised by what you get back. Given these two uniqueidentifier values: @g1= '55666BEE-B3A0-4BF5-81A7-86FF976E763F' @g2 = '8DD5BCA5-6ABE-4F73-B4B7-393AE6BBB849' Many people think that @g1 is less than @g2, since '55666BEE' is certainly smaller than '8DD5BCA5'. However, this is not how SQL Server 2005 compares uniqueidentifier values. The comparison is made by looking at byte "groups" right-to-left, and left-to-right within a byte "group". A byte group is what is delimited by the '-' character. More technically, we look at bytes {10 to 15} first, then {8-9}, then {6-7}, then {4-5}, and lastly {0 to 3}. In this specific example, we would start by comparing '86FF976E763F' with '393AE6BBB849'. Immediately we see that @g2 is indeed greater than @g1. Note that in .NET languages, Guid values have a different default sort order than in SQL Server. If you find the need to order an array or list of Guid using SQL Server comparison semantics, you can use an array or list of SqlGuid instead, which implements IComparable in a way which is consistent with SQL Server semantics. |
||||
14 окт 13, 14:07 [14966924] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Я говорил лишь о критериях определения больше/меньше. |
||||
14 окт 13, 14:08 [14966935] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Зачем вы тогда вообще затеяли эту дсикуссию, если вам все понятно ? |
||
14 окт 13, 14:09 [14966946] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
Да, мне понятно с сортировкой гуидов, а "затеял эту дискуссию" вот из-за этой фразы, я повторюсь с вашего позволения: Creates a GUID that is greater than any GUID previously generated by this function on a specified computer since Windows was started. After restarting Windows, the GUID can start again from a lower range, but is still globally unique. When a GUID column is used as a row identifier, using NEWSEQUENTIALID can be faster than using the NEWID function. This is because the NEWID function causes random activity and uses fewer cached data pages. Using NEWSEQUENTIALID also helps to completely fill the data and index pages. т.е. после рестарта новый сгенерированный гуид уже не будет больше последнего сгенерированного до рестарта? |
||||
14 окт 13, 14:15 [14966991] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Что вам мешает перестартовать сервер и узнать ответ ? |
||
14 окт 13, 14:16 [14966996] Ответить | Цитировать Сообщить модератору |
Winnipuh Member [заблокирован] Откуда: Київ Сообщений: 10428 |
ничто, но я не уверен, что это будет ответ после одного или двух рестартов, потому и задал вопрос. Как по мне стрёмная фраза.. Можно, конечно, плюнуть и смириться, мол и так хорошо (ц), все же лучше, чем NEWID() или в клиентском коде, но извечная тяга к знаниям будоражит ум... ![]() |
||||
14 окт 13, 14:20 [14967027] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Сделайте несколько рестартов, если ничего не мешает |
||
14 окт 13, 14:20 [14967035] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |