Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вопроc по NEWSEQUENTIALID()  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а вы, простите, гуиды сравниваете на больше / меньше? имхо тут важно что они последовательно монотонны
14 окт 13, 12:50    [14966249]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Crimean
а вы, простите, гуиды сравниваете на больше / меньше? имхо тут важно что они последовательно монотонны


я не сравниваю, фраза сумщает.
А разве "последовательно монотонны" не предполагает сравнение?
14 окт 13, 12:51    [14966262]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Crimean
Member

Откуда:
Сообщений: 13147
2 Winnipuh

для гуидов? мне как-то в голову не проходило, честно )) ну поправили распределение и хорошо. а как поправили - глобально или только для процесса / стейтмента / батча - я не копал сильно, да и не вижу смысла
я и обычные identity страх как не люблю сравнивать, уж лучше getdate() с уточнением (не более того) по identity
а тут - гуиды. фу-фу-фу
14 окт 13, 13:13    [14966488]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
т.е. после рестарта новый сгенерированный гуид уже не будет больше последнего сгенерированного до рестарта?

По-моему, даже 2 последовательных инсерта в одну таблицу не гаратируют, что более поздний инсерт сгенерирует бо'льшие значения
14 окт 13, 13:15    [14966502]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
NEWSEQUENTIALID()
Guest
Glory
Winnipuh
т.е. после рестарта новый сгенерированный гуид уже не будет больше последнего сгенерированного до рестарта?

По-моему, даже 2 последовательных инсерта в одну таблицу не гаратируют, что более поздний инсерт сгенерирует бо'льшие значения


вы натыкались на подобное поведение это функции?
в bol-е пишут обратное
автор
Creates a GUID that is greater than any GUID previously generated by this function on a specified computer since Windows was started.
14 окт 13, 13:28    [14966589]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Crimean
2 Winnipuh

для гуидов? мне как-то в голову не проходило, честно )) ну поправили распределение и хорошо. а как поправили - глобально или только для процесса / стейтмента / батча - я не копал сильно, да и не вижу смысла
я и обычные identity страх как не люблю сравнивать, уж лучше getdate() с уточнением (не более того) по identity
а тут - гуиды. фу-фу-фу


ну так речь о спец. гуидах, майкрософт утверждает, что при вызовах этой функции идет возрастающая последовательность, что важно для кластерных индексов.

Мало того, они еще замечают, что мол, если вы используете seq. гуиды в важных таблицах будьте начеку - ведь можно легко прогнозировать следующие значения и крэкнуть к идрени фене ваши данные
14 окт 13, 13:33    [14966631]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
NEWSEQUENTIALID()
Guest
Glory
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го




действительно, в "строковом" представлении диапазоны пересекаются, у меня получились
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]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
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го




не совсем понятно...

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]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
не совсем понятно...

Вот именно, что непонятно, как вы сравниваете на больше/меньше
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]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
не совсем понятно...

Вот именно, что непонятно, как вы сравниваете на больше/меньше
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


я сравниваю???

Майкрософт сравнивает, я всего лишь использовал ORDER BY.
14 окт 13, 13:55    [14966816]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
я сравниваю???

ну да. Вы же поставили order by u. Значит у вас есть критерии, почему одно значение больше/меньше другого.
Я, например, отбросил повторяющуюся часть.
14 окт 13, 13:57    [14966827]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
не совсем понятно...

Вот именно, что непонятно, как вы сравниваете на больше/меньше
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


речь идет про гуиды, а не про varbinary.
и функция NEWSEQUENTIALID() выдает последовательность гуидов, а не чего-то другого.

Другой вопрос, что ваше представление разошлось с тем, как это реализовано MS, вы видимо думали, что они тоже будут преобразовывать в честные двоичные значения?
14 окт 13, 13:59    [14966850]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
я сравниваю???

ну да. Вы же поставили order by u. Значит у вас есть критерии, почему одно значение больше/меньше другого.
Я, например, отбросил повторяющуюся часть.




"отбросил" и преобразовал в бинарную форму? зачем? см. мой предыдущий пост.
14 окт 13, 14:00    [14966857]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
"отбросил" и преобразовал в бинарную форму? зачем?

The uniqueidentifier data type stores 16-byte binary values
14 окт 13, 14:01    [14966871]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
NEWSEQUENTIALID()
Guest
Glory
Winnipuh
"отбросил" и преобразовал в бинарную форму? зачем?

The uniqueidentifier data type stores 16-byte binary values

это не говорит о том, что храниться должно в том же виде, что и отображается.
14 окт 13, 14:06    [14966908]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
"отбросил" и преобразовал в бинарную форму? зачем?

The uniqueidentifier data type stores 16-byte binary values


и что из этого следует?
еще раз ваши значения, в которых вы усомнились

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]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
"отбросил" и преобразовал в бинарную форму? зачем?

The uniqueidentifier data type stores 16-byte binary values



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]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Glory
Member

Откуда:
Сообщений: 104751
NEWSEQUENTIALID()
Glory
пропущено...

The uniqueidentifier data type stores 16-byte binary values

это не говорит о том, что храниться должно в том же виде, что и отображается.

Я говорил лишь о критериях определения больше/меньше.
14 окт 13, 14:08    [14966935]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
SQL Server (заметьте, не я!) отсортировал их как UNIQUEIDENTIFIER, все сработало правильно. Последовательность возрастающая.
Зачем что-то куда-то преобразовывать?

Зачем вы тогда вообще затеяли эту дсикуссию, если вам все понятно ?
14 окт 13, 14:09    [14966946]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
SQL Server (заметьте, не я!) отсортировал их как UNIQUEIDENTIFIER, все сработало правильно. Последовательность возрастающая.
Зачем что-то куда-то преобразовывать?

Зачем вы тогда вообще затеяли эту дсикуссию, если вам все понятно ?


Да, мне понятно с сортировкой гуидов, а "затеял эту дискуссию" вот из-за этой фразы, я повторюсь с вашего позволения:

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]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
т.е. после рестарта новый сгенерированный гуид уже не будет больше последнего сгенерированного до рестарта?

Что вам мешает перестартовать сервер и узнать ответ ?
14 окт 13, 14:16    [14966996]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
т.е. после рестарта новый сгенерированный гуид уже не будет больше последнего сгенерированного до рестарта?

Что вам мешает перестартовать сервер и узнать ответ ?


ничто, но я не уверен, что это будет ответ после одного или двух рестартов, потому и задал вопрос.
Как по мне стрёмная фраза.. Можно, конечно, плюнуть и смириться, мол и так хорошо (ц), все же лучше, чем NEWID() или в клиентском коде, но извечная тяга к знаниям будоражит ум...
14 окт 13, 14:20    [14967027]     Ответить | Цитировать Сообщить модератору
 Re: Вопроc по NEWSEQUENTIALID()  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
ничто, но я не уверен, что это будет ответ после одного или двух рестартов, потому и задал вопрос.

Сделайте несколько рестартов, если ничего не мешает
14 окт 13, 14:20    [14967035]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить