Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / UPDATE вместо перечисления / 11 сообщений из 11, страница 1 из 1
14.07.2021, 11:55
    #40083733
Kostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Добрый день!

В скриптах миграции для ускорения работы вместо использования перечисления, сотрудники моей компании использовали следующую необычную конструкцию:

declare @count int
set @count = next value for Seq_LabelSetId

UPDATE [Card_Card] SET @count = [LabelSetId] = @count + 1

Она сработала корректно несколько раз, но на одном из очередных обновлений после выполнения в таблице оказалось множество строк с неуникальными значениями (по 4 на каждое значение).

Проблему решил другим способом (задействовал перечисление, но временно изменил размер кэша для быстроты), но вопросы остались.

1. Корректно ли вообще такое выражение? Впервые вижу такое. Сервер выполняет его, но тем не менее.

2. Предположили, что причина в распараллеливании запроса. Как думаете, это верно?


Заранее спасибо!
...
Рейтинг: 0 / 0
14.07.2021, 12:23
    #40083745
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Причина не в распараллеливании запроса, а в одновременном выполнении этого запроса в разных сессиях
Почему нельзя было просто написать
Код: sql
1.
UPDATE [Card_Card] SET [LabelSetId] = next value for Seq_LabelSetId

?
...
Рейтинг: 0 / 0
14.07.2021, 12:50
    #40083757
Kostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
invm,

вариант UPDATE [Card_Card] SET [LabelSetId] = next value for Seq_LabelSetId
более правильный, в итоге мы его и задействовали (сменив размер кэша перечисления для быстрой работы).

Но вопросы по выражению остались.

Насколько я знаю обновление, накатывающее миграции, переводит БД в Single_User и вызова из разных сессий быть не должно - уточню у девопсов.
...
Рейтинг: 0 / 0
14.07.2021, 13:13
    #40083766
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Kostt,

Выражение вполне себе рабочее.
И UPDATE не распараллеливается.

Может обновляется не таблица, а представление? Или есть триггеры, которые могут пакостить?

ЗЫ: Не обратил внимания, что обновляется таблица целиком. Тогда дубликатов быть не должно.
...
Рейтинг: 0 / 0
14.07.2021, 13:26
    #40083768
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Kostt,
ставим ограничение уникальности на поле, в котором не должно быть дублей
отдаём обновы для наката
ждём
...
Рейтинг: 0 / 0
14.07.2021, 20:50
    #40083902
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Kostt,

переводите базу в SINGLE_USER во избежание недоразумений подобного рода.
...
Рейтинг: 0 / 0
14.07.2021, 23:29
    #40083925
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Kostt,

1. Выражение
Код: sql
1.
UPDATE [Card_Card] SET @count = [LabelSetId] = @count + 1

использовалось до включения в T-SQL объекта SEQUENCE для формирования числовой последовательности. Я не уверен, что UPDATE [Card_Card] работает быстрее SEQUENCE.

2. Выражения
Код: sql
1.
2.
3.
declare @count int
set @count = next value for Seq_LabelSetId
UPDATE [Card_Card] SET @count = [LabelSetId] = @count + 1


и
Код: sql
1.
UPDATE [Card_Card] SET [LabelSetId] = next value for Seq_LabelSetId


в общем случае не эквивалентны.

В первом случае последовательности Card_Card в качестве начального значения задается очередное значение последовательности Seq_LabelSetId и после этого числовая последовательность Card_Card генерируется независимо от последовательности Seq_LabelSetId. Возможно, на это время значение последовательности Seq_LabelSetId должно быть зафиксировано.

Во втором случае последовательность Card_Card синхронно меняется с последовательностью Seq_LabelSetId. Тогда одна из них лишняя.

Полного текста скрипта миграции у нас-то нет, всего только три строки.

3. Появление в целевой таблице строк с неуникальными значениями последовательности (по 4 на каждое значение), скорее всего, связано с исходными данными. Работало правильно, но один раз … Начинать надо с проверки исходных данных.
"Не вини коня - вини дорогу
И коня не торопись менять".
...
Рейтинг: 0 / 0
15.07.2021, 09:45
    #40083979
Alex_Toms
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Для миграции можно пронумеровать записи в запросе для вставки добавив row_number.
...
Рейтинг: 0 / 0
15.07.2021, 11:18
    #40084036
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Wlr-l,

Прочитать о конструкции
Код: sql
1.
UPDATE [Card_Card] SET @count = [LabelSetId] = @count + 1

можно в книге Ицика Бен-Гана "Microsoft SQL Server 2008. Основы T-SQL", Глава 8. Модификация данных, Присваивание в UPDATE, с. 258.
...
Рейтинг: 0 / 0
15.07.2021, 11:44
    #40084051
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Wlr-l,

Такая возможность описана в документации:

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/update-transact-sql?view=sql-server-ver15

UPDATE
. . .
SET
. . .
| @variable = column = expression
. . .
...
Рейтинг: 0 / 0
20.07.2021, 19:54
    #40084917
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE вместо перечисления
Kostt,

А сильно ускориться апдейт из первого сообщения по сравнению с обычным методом?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / UPDATE вместо перечисления / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]