SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 31.01.13 21:01
Оценка:
Почему то после перехода с SQL 2008R2 на SQL 2012 (возможно, просто совпало) стал странно работать автоинкремент. А именно раз в неделю идет переход на 10к. Тоесть если пред закончилась на 45765 номере, то след номер получается 55765. Не понимаю в чем может быть причина. Можно ли как-то это понять?
Re: SQL 2012 Автоинкремент. Большие пробелы
От: Olaf Россия  
Дата: 01.02.13 03:30
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Почему то после перехода с SQL 2008R2 на SQL 2012 (возможно, просто совпало) стал странно работать автоинкремент. А именно раз в неделю идет переход на 10к. Тоесть если пред закончилась на 45765 номере, то след номер получается 55765. Не понимаю в чем может быть причина. Можно ли как-то это понять?


Почитайте обсуждение здесь Failover or Restart Results in Reseed of Identity Данная проблема возникает не только при использовании Always On, но и при перезагрузке сервера. Там же можно найти объяснение и рекомендации от Microsoft …

Posted by Microsoft on 10.12.2012 at 10:00
Hello,
First off we do apologize for the late response to this issue.

In SQL Server 2012 the implementation of the identity property has been changed to accommodate investments into other features. In previous versions of SQL Server the tracking of identity generation relied on transaction log records for each identity value generated. In SQL Server 2012 we generate identity values in batches and log only the max value of the batch. This reduces the amount and frequency of information written to the transaction log improving insert scalability.

If you require the same identity generation semantics as previous versions of SQL Server there are two options available:
• Use trace flag 272
o This will cause a log record to be generated for each generated identity value. The performance of identity generation may be impacted by turning on this trace flag.
• Use a sequence generator with the NO CACHE setting(http://msdn.microsoft.com/en-us/library/ff878091.aspx)
o This will cause a log record to be generated for each generated sequence value. Note that the performance of sequence value generation may be impacted by using NO CACHE.
o Example:
CREATE SEQUENCE s1 AS INT START WITH 1 NO CACHE;
CREATE TABLE t1 (Id INT PRIMARY KEY DEFAULT NEXT VALUE FOR s1, col INT NOT NULL);

As documented in books online for previous versions of SQL Server the identity property does not guarantee the absence of gaps, this statement remains true for the above workarounds. These solutions do help with removing the gaps that occur as part of restarting the instance in SQL Server 2012.

Best regards
Vishal

Re[2]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 01.02.13 14:02
Оценка:
Здравствуйте, Olaf, Вы писали:

Спасибо большое. Действительно, совпадает в датами ребутания сервера. Какой ужас. Выпускать такой продукт с таким дефектом. Это нужно большими красными буквами прописывать при установке. Что-то у МС совсем плохо стало. То Винда 8 оказалась ужасом, то новая студия с ужасной эргономикой. Теперь вот БД.

А что за новый формат создания ID?

If you require the same identity generation semantics as previous versions of SQL Server


Тоесть есть какой-то новый способ?
Re[3]: SQL 2012 Автоинкремент. Большие пробелы
От: dr. Acula Украина  
Дата: 01.02.13 14:06
Оценка:
А>Спасибо большое. Действительно, совпадает в датами ребутания сервера. Какой ужас. Выпускать такой продукт с таким дефектом. Это нужно большими красными буквами прописывать при установке.
А что, кто-то утверждал, что автоинкремент должен быть последовательным?
А>Что-то у МС совсем плохо стало. То Винда 8 оказалась ужасом, то новая студия с ужасной эргономикой. Теперь вот БД.
Ога.
Re[3]: SQL 2012 Автоинкремент. Большие пробелы
От: Olaf Россия  
Дата: 01.02.13 14:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>

А>If you require the same identity generation semantics as previous versions of SQL Server


А>Тоесть есть какой-то новый способ?


Я понимаю ваше возмущение, но как правильно сказали выше – инкремент не гарантирует отсутствия дырок. Возможно, Microsoft допустили некоторую оплошность, не акцентировав внимание общественности на изменении подхода в версии 2012.

Как я понял, для возврата к предыдущему поведению они предлагают 2-а рецепта, из того же обсуждения:

If you require the same identity generation semantics as previous versions of SQL Server there are two options available:
• Use trace flag 272
...
• Use a sequence generator with the NO CACHE setting(http://msdn.microsoft.com/en-us/library/ff878091.aspx)
...

У нас аналогичная проблема, но наличие больших дырок не является критичным, поэтому предложенные рецепты не пробовали.
Re[4]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 01.02.13 14:51
Оценка:
Здравствуйте, Olaf, Вы писали:

O>• Use a sequence generator with the NO CACHE setting(http://msdn.microsoft.com/en-us/library/ff878091.aspx)


Получается, что нужно будет:

1) создать для каждой таблицы по отдельной sequence (без указания размера кеша).
2) удалить auto_inc у всех таблиц.
3) переделать все места, где ID не передается, и передавать туда next value for TableName_sequence

Интересно, scope_identity при этом останется работать? Или нужно временную переменную вводить перед insert чтобы потом select делать на клиент?
Re[5]: SQL 2012 Автоинкремент. Большие пробелы
От: Olaf Россия  
Дата: 01.02.13 16:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Получается, что нужно будет:


А>1) создать для каждой таблицы по отдельной sequence (без указания размера кеша).

А>2) удалить auto_inc у всех таблиц.
А>3) переделать все места, где ID не передается, и передавать туда next value for TableName_sequence

А>Интересно, scope_identity при этом останется работать? Или нужно временную переменную вводить перед insert чтобы потом select делать на клиент?


В целом направление правильное, только в п.3 можно облегчить себе жизнь, создав default constraint, который будет использовать next value for, соответственно явно передавать значение ID необязательно. Пример:
alter table dbo.TableWithSeq add constraint DFS default (next value for DemoSeq) for Id

При использовании последовательностей забудьте про scope_identity, там свои подходы. Например, получить текущее значение:
select current_value from sys.sequences where name = 'Последовательность'

А почему вы сразу перешли ко второму способу, опустив использование флага трассировки?
Re[6]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 01.02.13 16:09
Оценка:
Здравствуйте, Olaf, Вы писали:

O>А почему вы сразу перешли ко второму способу, опустив использование флага трассировки?


Смущает фраза:

The performance of identity generation may be impacted by turning on this trace flag.


Производительность будет хуже через у последовательностей или хуже даже старого использовать auto_inc?
Re[7]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 01.02.13 16:16
Оценка:
Здравствуйте, Аноним, Вы писали:

И как этот флаг включается? Я с трассировкой не работал до этого.
Re[8]: SQL 2012 Автоинкремент. Большие пробелы
От: Olaf Россия  
Дата: 01.02.13 17:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>И как этот флаг включается? Я с трассировкой не работал до этого.


Посмотрите DBCC TRACEON
Re[9]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 01.02.13 17:52
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Аноним, Вы писали:


А>>И как этот флаг включается? Я с трассировкой не работал до этого.


O>Посмотрите DBCC TRACEON


Спасибо, включил глобально. Буду наблюдать за производительностью. В принципе у нас система не такая уже высоко нагрузочная. Может быть удастся избежать лишних проблем. Буду следить за развитием темы и уже на SP1 с опаской переходить.
Re[7]: SQL 2012 Автоинкремент. Большие пробелы
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.02.13 16:06
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Производительность будет хуже через у последовательностей или хуже даже старого использовать auto_inc?

Производительность, очевидно, будет как у старого.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: SQL 2012 Автоинкремент. Большие пробелы
От: MasterZiv СССР  
Дата: 04.02.13 09:37
Оценка:
А>Спасибо большое. Действительно, совпадает в датами ребутания сервера. Какой ужас. Выпускать такой продукт с таким дефектом. Это нужно большими красными буквами прописывать при установке. Что-то у МС совсем плохо стало. То Винда 8 оказалась ужасом, то новая студия с ужасной эргономикой. Теперь вот БД.

Это не дефект, это by design. Причём не только у MSSQL.
ты просто (пока) этого не понимаешь, что только так и надо.
Re[10]: SQL 2012 Автоинкремент. Большие пробелы
От: wildwind Россия  
Дата: 04.02.13 12:01
Оценка: +4
Здравствуйте, Аноним, Вы писали:

А>Спасибо, включил глобально. Буду наблюдать за производительностью. В принципе у нас система не такая уже высоко нагрузочная. Может быть удастся избежать лишних проблем. Буду следить за развитием темы и уже на SP1 с опаской переходить.


А чем "дырки" так сильно мешают, можно узнать? Чисто "некрасиво" или вы умудрились бизнес-логику на это завязать?
Re[10]: SQL 2012 Автоинкремент. Большие пробелы
От: avpavlov  
Дата: 04.02.13 14:40
Оценка:
А>Спасибо, включил глобально.

Дырки всё равно могут быть из-за ролбэков, так что если у тебя какая-то логика завязана на "бездырочность", лучше отвязать
Re[11]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 05.02.13 11:03
Оценка: :))
Здравствуйте, wildwind, Вы писали:

W>А чем "дырки" так сильно мешают, можно узнать? Чисто "некрасиво" или вы умудрились бизнес-логику на это завязать?


Чисто неудобно использовать. Идет клиент с номером 1234, а затем 12345. Вводит путаницу.
Re[12]: SQL 2012 Автоинкремент. Большие пробелы
От: cvetkov  
Дата: 05.02.13 17:37
Оценка: +4
Здравствуйте, <Аноним>, Вы писали:

W>>А чем "дырки" так сильно мешают, можно узнать? Чисто "некрасиво" или вы умудрились бизнес-логику на это завязать?


А>Чисто неудобно использовать. Идет клиент с номером 1234, а затем 12345. Вводит путаницу.

и ради этого вы готовы жертвовать производительностью?
а в чем конкретно неудобство?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[13]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 05.02.13 23:20
Оценка: :))
Здравствуйте, cvetkov, Вы писали:

А>>Чисто неудобно использовать. Идет клиент с номером 1234, а затем 12345. Вводит путаницу.

C>и ради этого вы готовы жертвовать производительностью?

В моем жизни удобство моей работы важнее производительности какой то там программы.
Re[14]: SQL 2012 Автоинкремент. Большие пробелы
От: cvetkov  
Дата: 06.02.13 05:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>>>Чисто неудобно использовать. Идет клиент с номером 1234, а затем 12345. Вводит путаницу.

C>>и ради этого вы готовы жертвовать производительностью?
А>В моем жизни удобство моей работы важнее производительности какой то там программы.

повезло вам.
а в чем, всетаки, удобство?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[14]: SQL 2012 Автоинкремент. Большие пробелы
От: cvetkov  
Дата: 06.02.13 05:12
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>>>Чисто неудобно использовать. Идет клиент с номером 1234, а затем 12345. Вводит путаницу.

C>>и ради этого вы готовы жертвовать производительностью?
А>В моем жизни удобство моей работы важнее производительности какой то там программы.

повезло вам.
а в чем, всетаки, удобство?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[15]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 06.02.13 20:16
Оценка: :)
Здравствуйте, cvetkov, Вы писали:

C>Здравствуйте, <Аноним>, Вы писали:



А>>>>Чисто неудобно использовать. Идет клиент с номером 1234, а затем 12345. Вводит путаницу.

C>>>и ради этого вы готовы жертвовать производительностью?
А>>В моем жизни удобство моей работы важнее производительности какой то там программы.

C>повезло вам.

C>а в чем, всетаки, удобство?

У меня и моих сотрудников при интенсивной работе откладываются в памяти ассоциации вида с 1000-2000 клиенты — это первый квартал 2012. с 5000-7000 — второй квартал и т.д. Проще понимать, откуда человек пришел. Плюс бухгалтерия и лицензирование завязаны на эти номера. Нас польстили вопросом "а правда что у вас уже 100 тыщ лицензий?". Выглядит как некий обман в глазах покупателей.

Вообщем все это не критично, просто раздражают эти большие гэпы.
Re[16]: SQL 2012 Автоинкремент. Большие пробелы
От: wildwind Россия  
Дата: 06.02.13 21:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вообщем все это не критично, просто раздражают эти большие гэпы.


Вы вполне можете перейти на последовательность без кэширования для этой одной таблицы. В данном случае удобство действительно важнее производительности. Замечание в BOL относительно производительности генерации относится к сценариям с действительно большой нагрузкой: десятки и сотни вставок в секунду.
Re[17]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 06.02.13 23:58
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Вы вполне можете перейти на последовательность без кэширования для этой одной таблицы. В данном случае удобство действительно важнее производительности. Замечание в BOL относительно производительности генерации относится к сценариям с действительно большой нагрузкой: десятки и сотни вставок в секунду.


Так уже. Я же отписался, что флаг включил.

Я так и подумал, что это очередной рекламный базворд. Не всем нужны такие мощности, но базы данных нужны многим. На 2005 проблем не было, на 2008 проблем не было, а на 2012 меня застращали. Ну рекламщики, ну майкрософт.
Re[18]: SQL 2012 Автоинкремент. Большие пробелы
От: dilmah США  
Дата: 07.02.13 00:05
Оценка:
А>Я так и подумал, что это очередной рекламный базворд. Не всем нужны такие мощности, но базы данных нужны многим. На 2005 проблем не было, на 2008 проблем не было, а на 2012 меня застращали. Ну рекламщики, ну майкрософт.

проблема это ты.
Re[16]: SQL 2012 Автоинкремент. Большие пробелы
От: cvetkov  
Дата: 07.02.13 06:02
Оценка: +2
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, cvetkov, Вы писали:


C>>Здравствуйте, <Аноним>, Вы писали:



А>>>>>Чисто неудобно использовать. Идет клиент с номером 1234, а затем 12345. Вводит путаницу.

C>>>>и ради этого вы готовы жертвовать производительностью?
А>>>В моем жизни удобство моей работы важнее производительности какой то там программы.

C>>повезло вам.

C>>а в чем, всетаки, удобство?

А>У меня и моих сотрудников при интенсивной работе откладываются в памяти ассоциации вида с 1000-2000 клиенты — это первый квартал 2012. с 5000-7000 — второй квартал и т.д.

это же плохо. что делать с номерами 2000-5000? если эта информация нужна, ее нужно выводить в явном виде. а память сотрудников использовать для чего-нибуть более полезного.
А> Проще понимать, откуда человек пришел. Плюс бухгалтерия и лицензирование завязаны на эти номера.
Как если не секрет? Просто это попахивает плохим дизайном.
А> Нас польстили вопросом "а правда что у вас уже 100 тыщ лицензий?". Выглядит как некий обман в глазах покупателей.
это не обман а самообман, если вы конечно не обещали соответствия явно. а самообман на совести самообманывающегося.

А>Вообщем все это не критично, просто раздражают эти большие гэпы.
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[17]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 08.02.13 22:53
Оценка:
Здравствуйте, cvetkov, Вы писали:

А>> Проще понимать, откуда человек пришел. Плюс бухгалтерия и лицензирование завязаны на эти номера.

C>Как если не секрет? Просто это попахивает плохим дизайном.

Номер лицензии — это первичный ключ. Номер договора, акта, счета — так же.
Re[18]: SQL 2012 Автоинкремент. Большие пробелы
От: cvetkov  
Дата: 09.02.13 06:53
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>>> Проще понимать, откуда человек пришел. Плюс бухгалтерия и лицензирование завязаны на эти номера.

C>>Как если не секрет? Просто это попахивает плохим дизайном.

А>Номер лицензии — это первичный ключ. Номер договора, акта, счета — так же.

ну и какая разница какое конкретно там будет значение?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[19]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 09.02.13 11:50
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>Здравствуйте, <Аноним>, Вы писали:


А>>>> Проще понимать, откуда человек пришел. Плюс бухгалтерия и лицензирование завязаны на эти номера.

C>>>Как если не секрет? Просто это попахивает плохим дизайном.

А>>Номер лицензии — это первичный ключ. Номер договора, акта, счета — так же.

C>ну и какая разница какое конкретно там будет значение?

Удобно, когда нет больших гэпов. Я же пишу, это вводит в некоторое затруднение. Сразу возникает вопрос — а где предыдущие 10 тыщ лицензий. Когда гэп в 1-10 пунктов, то это не важно и заметно. И не отвлекает. А когда такой явный переход — это сразу напрягает.

Я же пишу — программа сделана для людей. Человек — это не компьютер. Тут свои особенности в восприятии информации.
Re[20]: SQL 2012 Автоинкремент. Большие пробелы
От: cvetkov  
Дата: 09.02.13 12:59
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>>>Номер лицензии — это первичный ключ. Номер договора, акта, счета — так же.

C>>ну и какая разница какое конкретно там будет значение?

А>Удобно, когда нет больших гэпов. Я же пишу, это вводит в некоторое затруднение. Сразу возникает вопрос — а где предыдущие 10 тыщ лицензий. Когда гэп в 1-10 пунктов, то это не важно и заметно. И не отвлекает. А когда такой явный переход — это сразу напрягает.

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

А>Я же пишу — программа сделана для людей. Человек — это не компьютер. Тут свои особенности в восприятии информации.

так надо обучать людей. или научится красиво врать
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[21]: SQL 2012 Автоинкремент. Большие пробелы
От: Аноним  
Дата: 09.02.13 14:28
Оценка:
Здравствуйте, cvetkov, Вы писали:

А>>Я же пишу — программа сделана для людей. Человек — это не компьютер. Тут свои особенности в восприятии информации.

C>так надо обучать людей. или научится красиво врать

А еще проше — включить флаг трассировки. Что и было сделано. Не люблю изобретать сложные пути для решения простых проблем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.