|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
Добрый день! В скриптах миграции для ускорения работы вместо использования перечисления, сотрудники моей компании использовали следующую необычную конструкцию: declare @count int set @count = next value for Seq_LabelSetId UPDATE [Card_Card] SET @count = [LabelSetId] = @count + 1 Она сработала корректно несколько раз, но на одном из очередных обновлений после выполнения в таблице оказалось множество строк с неуникальными значениями (по 4 на каждое значение). Проблему решил другим способом (задействовал перечисление, но временно изменил размер кэша для быстроты), но вопросы остались. 1. Корректно ли вообще такое выражение? Впервые вижу такое. Сервер выполняет его, но тем не менее. 2. Предположили, что причина в распараллеливании запроса. Как думаете, это верно? Заранее спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 11:55 |
|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
Причина не в распараллеливании запроса, а в одновременном выполнении этого запроса в разных сессиях Почему нельзя было просто написать Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 12:23 |
|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
invm, вариант UPDATE [Card_Card] SET [LabelSetId] = next value for Seq_LabelSetId более правильный, в итоге мы его и задействовали (сменив размер кэша перечисления для быстрой работы). Но вопросы по выражению остались. Насколько я знаю обновление, накатывающее миграции, переводит БД в Single_User и вызова из разных сессий быть не должно - уточню у девопсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 12:50 |
|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
Kostt, Выражение вполне себе рабочее. И UPDATE не распараллеливается. Может обновляется не таблица, а представление? Или есть триггеры, которые могут пакостить? ЗЫ: Не обратил внимания, что обновляется таблица целиком. Тогда дубликатов быть не должно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 13:13 |
|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
Kostt, ставим ограничение уникальности на поле, в котором не должно быть дублей отдаём обновы для наката ждём ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 13:26 |
|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
Kostt, переводите базу в SINGLE_USER во избежание недоразумений подобного рода. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 20:50 |
|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
Kostt, 1. Выражение Код: sql 1.
использовалось до включения в T-SQL объекта SEQUENCE для формирования числовой последовательности. Я не уверен, что UPDATE [Card_Card] работает быстрее SEQUENCE. 2. Выражения Код: sql 1. 2. 3.
и Код: sql 1.
в общем случае не эквивалентны. В первом случае последовательности Card_Card в качестве начального значения задается очередное значение последовательности Seq_LabelSetId и после этого числовая последовательность Card_Card генерируется независимо от последовательности Seq_LabelSetId. Возможно, на это время значение последовательности Seq_LabelSetId должно быть зафиксировано. Во втором случае последовательность Card_Card синхронно меняется с последовательностью Seq_LabelSetId. Тогда одна из них лишняя. Полного текста скрипта миграции у нас-то нет, всего только три строки. 3. Появление в целевой таблице строк с неуникальными значениями последовательности (по 4 на каждое значение), скорее всего, связано с исходными данными. Работало правильно, но один раз … Начинать надо с проверки исходных данных. "Не вини коня - вини дорогу И коня не торопись менять". ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 23:29 |
|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
Для миграции можно пронумеровать записи в запросе для вставки добавив row_number. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2021, 09:45 |
|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
Wlr-l, Прочитать о конструкции Код: sql 1.
можно в книге Ицика Бен-Гана "Microsoft SQL Server 2008. Основы T-SQL", Глава 8. Модификация данных, Присваивание в UPDATE, с. 258. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2021, 11:18 |
|
UPDATE вместо перечисления
|
|||
---|---|---|---|
#18+
Wlr-l, Такая возможность описана в документации: https://docs.microsoft.com/ru-ru/sql/t-sql/queries/update-transact-sql?view=sql-server-ver15 UPDATE . . . SET . . . | @variable = column = expression . . . ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2021, 11:44 |
|
|
start [/forum/topic.php?fid=46&msg=40083925&tid=1684489]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 148ms |
0 / 0 |