|
|
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
Работаю с системой, которая в качестве базы использует MS SQL(в моем случае 2005). Для получения идентификаторов для новых записей(PRIMARY KEY) система вместе increment использует следующий прием. Таблицу Keys с двумя столбцами: идентификатором таблицы и последним вставленным ключем. Код: sql 1. 2. 3. 4. А так же процедуру для извлечения нового значения Код: sql 1. Такой прием заставляет меня постоянно пользоваться курсорами, что доставляет массу хлопот. Плюс насколько я понимаю, у sequence есть одно преимущество в плане проектирования. Сквозная нумерация для нескольких таблиц, но здесь такой подход не используется. Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход? Может есть какие скрытые плюсы, о которых я не подозреваю? А какие достоинства есть у настоящего sequence в MS SQL 2012? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 10:17 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
.Anatoly. Может есть какие скрытые плюсы, о которых я не подозреваю? Ну, возможно, больше возможностей в управлении значениями идентификатора. Например, окажется через некоторое время, что нужно организовать равноправноую асинхронную репликацию. Инкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность. В общем , возможно, это более консервативный подход в плане рисков лишнего геммора на этапе сопровождения (за счет немного большего геммора на этапе разработки). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 10:35 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
имелосьь в иду одно и тоже значение идентификатора для разных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 10:37 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
vadiminfoИнкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность.Что мешает настроить автоинкременты на заведома непересекающиеся интервалы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 11:06 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
.Anatoly.Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход?Ничем. ИМХО сделали по привычке - опытного сиквелиста не было, подсказать некому было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 11:07 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
LSVЧто мешает настроить автоинкременты на заведома непересекающиеся интервалы ? Ну, заведомость непересекаемости интервалов трбует, возможно, больших усилий, и риски пересечения остаются. Нечетные то сто пудово не пересуктся, а думать не надо совсем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 11:27 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
Например, они в ходе экплуатации возьми да экспортни послениние с первого на второй. Вот и попали в другй интервал на втором. А четность управляется. Такое может быть заложено в коде: если увидит не ту четность ее изменит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 11:48 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
.Anatoly.Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход? Варианты: 1. Тянется с версий системы, где в БД с SEQ были напряжёнки: - не было SEQ, - недостаточная функциональность SEQ - не устраивала производительность SEQ. 2. Планировали использовать не только MS SQL в качестве СУБД, а в других СУБД могут быть напряжёнки SEQ из п.1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 12:32 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
vadiminfo.Anatoly. Может есть какие скрытые плюсы, о которых я не подозреваю? Ну, возможно, больше возможностей в управлении значениями идентификатора. Например, окажется через некоторое время, что нужно организовать равноправноую асинхронную репликацию. Инкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность. В общем , возможно, это более консервативный подход в плане рисков лишнего геммора на этапе сопровождения (за счет немного большего геммора на этапе разработки). Вы описали интересный случай. А есть другое(более оптимальное) решение для него, кроме приведенного выше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 13:34 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
.Anatoly.А есть другое(более оптимальное) решение для него, кроме приведенного выше? Использование UUID - рулит! Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 13:37 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
.Anatoly.Вы описали интересный случай. А есть другое(более оптимальное) решение для него, кроме приведенного выше? Я особо не искал, поскоку это устроило. У меня Оракл, а там по любасу только последовательности. Но это просто пример, который означет, что в принципе риски могут, что последовательность может быть попроще на стадии сопровождении, поскоку позволят более гибко управлять формированием значений суррогатного идентификатора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 13:52 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
Глобальные идентификаторы всеже не очень хорошо визуально воспринимаются, поэтому отпугивают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 14:04 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
vadiminfoГлобальные идентификаторы всеже не очень хорошо визуально воспринимаются, поэтому отпугивают. Какой идиот станет показывать пользователю суррогатные ключи?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 14:14 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovКакой идиот станет показывать пользователю суррогатные ключи?.. Кроме конечного пользователя есть есче разработчики, админы. При анализе данных, например, на предмет ошибок значения суррогатов ингода могут просмотриваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 14:23 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
vadiminfoГлобальные идентификаторы всеже не очень хорошо визуально воспринимаются, поэтому отпугивают. Не только визуально. В смысле использования order by <identity> - это простой способ показать данные в порядке создания записей. А по поводу "организовать равноправную асинхронную репликацию" - именно так и делается, когда платформы разные, где-то guid-а нет, где-то sequence-ов. А такое решение будет работать на любом серваке из взрослых СУБД довольно старых версий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 14:28 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецовплатформы разные, где-то guid-а нет В этом случае он генерится на клиенте перед вставкой. Впрочем, это чаще всего удобно делать даже есть в СУБД есть встроенный генератор uuid-ов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 14:33 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
.Anatoly.vadiminfoпропущено... Ну, возможно, больше возможностей в управлении значениями идентификатора. Например, окажется через некоторое время, что нужно организовать равноправноую асинхронную репликацию. Инкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность. В общем , возможно, это более консервативный подход в плане рисков лишнего геммора на этапе сопровождения (за счет немного большего геммора на этапе разработки). Вы описали интересный случай. А есть другое(более оптимальное) решение для него, кроме приведенного выше?Оптимально - инкремент с разделением диапазонов или GUID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 16:52 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
.Anatoly.Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход? Такой подход даже в "версионном" Oracle всегда расценивался как bad design по соображениям масштабируемости. Крайне сомневаюсь, что для MSSQL найдутся соображения, которые делают его разумным. Здесь это когда-то обсуждали, и пришли к выводу, что в MS если по каким-то причинам не хватает функциональности identity, следует делать нетранзакционную внешнюю хранимку, генерирующую эти ключи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 17:51 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovКакой идиот станет показывать пользователю суррогатные ключи?.. Вообще промышленные системы обычно показывают, например Оракловые. А что такого? Ну увидит пользователь уникальный ключ, испугается и убежит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 18:11 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
.Anatoly., Такой подход (получение первичного ключа через select и update записи в таблице Keys) ошибочен на любых СУБД, т.к.: 1) версионник (если явно не наложить блокировку на изменяемую запись) может в случае одновременного обращения двух пользователей за ключами выдать им одинаковый ключ, и одна из транзакций срубится при последующей вставке этого ключа в таблицу; 2) блокировочник заблокирует измененную запись в таблице Keys до завершения транзакции, а остальные желающие добавить запись в ту же таблицу @strKeyTable будут тупо ждать этого завершения. В результате при достаточном количестве пользователей наступают тормоза и дедлоки. Для получения первичных ключей должны использоваться нетранзакционные механизмы (uuid, identity, sequence). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 18:37 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
mike.nsk.Anatoly., Такой подход (получение первичного ключа через select и update записи в таблице Keys) ошибочен на любых СУБД, т.к.: 1) версионник (если явно не наложить блокировку на изменяемую запись) может в случае одновременного обращения двух пользователей за ключами выдать им одинаковый ключ, и одна из транзакций срубится при последующей вставке этого ключа в таблицу; 2) блокировочник заблокирует измененную запись в таблице Keys до завершения транзакции , а остальные желающие добавить запись в ту же таблицу @strKeyTable будут тупо ждать этого завершения. В результате при достаточном количестве пользователей наступают тормоза и дедлоки. Для получения первичных ключей должны использоваться нетранзакционные механизмы (uuid, identity, sequence). Не на 100% так. На Informix можно сделать "нелогируемую" таблицу - свойства транзакции на изменения именно в этой таблице не будут распространяться. Будет чаще проявляться эффект "дыр" в последовательности (при откатах транзакций) - но в SEQ этот эффект такой же... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 18:54 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
АнатоЛой Не на 100% так. На Informix можно сделать "нелогируемую" таблицу - свойства транзакции на изменения именно в этой таблице не будут распространяться. Будет чаще проявляться эффект "дыр" в последовательности (при откатах транзакций) - но в SEQ этот эффект такой же... Ну стало быть это и есть разновидность нетранзакционного механизма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2012, 19:10 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
> Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход? Может есть какие > скрытые плюсы, о которых я не подозреваю? А какие достоинства есть у настоящего > sequence в MS SQL 2012? Прежде всего недостаток этого и достоинство identity в том, что identity не использует транзакционные механизмы, т.е. это быстро и дополнительно никому не мешает (нет взаимных блокировок на получении следующего идентификатора). А это решение наоборот блокирует эту твою таблицу (возможно, только одну запись в ней, возможно, страницу, а возможно и всю таблицу целиком) на период ВСЕЙ транзакции, избежать этого нельзя, и вынести получение нового ID за пределы транзакции тоже нельзя. Достоинства у такого метода -- -- контролируемость со стороны разработчика -- переносимость между разными СУБД. -- транзакционность. ACID гарантируется. Т.е. если что-то выделилось -- останется на века, а выделилось, и потом транзакция отменилась -- отменится и выделение нового идентификатора. (identity наоборот например нетранзакционна). Суммарно применять такой способ может быть нужно для генерации каки-то идентификаторов из предметной области, доступных для чтения пользователю, но для внутренних идентификаторов это -- смерть производительности (если она конечно важна). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2012, 10:49 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
On 08/01/2012 07:37 PM, mike.nsk wrote: > 1) версионник (если явно не наложить блокировку на изменяемую запись) может в > случае одновременного обращения двух пользователей за ключами выдать им > одинаковый ключ, и одна из транзакций срубится при последующей вставке этого > ключа в таблицу; Не пугай людей, не может. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2012, 10:53 |
|
||
|
increment vs недо sequence
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 08/01/2012 07:37 PM, mike.nsk wrote: > 1) версионник (если явно не наложить блокировку на изменяемую запись) может в > случае одновременного обращения двух пользователей за ключами выдать им > одинаковый ключ, и одна из транзакций срубится при последующей вставке этого > ключа в таблицу; Не пугай людей, не может. Смотря как сделать. Майк, полагаю, имеет в виду вариант наподобие Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2012, 11:59 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37899973&tid=1541597]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
86ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 486ms |

| 0 / 0 |
