powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / UPDATE вместо перечисления
11 сообщений из 11, страница 1 из 1
UPDATE вместо перечисления
    #40083733
Kostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

переводите базу в SINGLE_USER во избежание недоразумений подобного рода.
...
Рейтинг: 0 / 0
UPDATE вместо перечисления
    #40083925
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
UPDATE вместо перечисления
    #40083979
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для миграции можно пронумеровать записи в запросе для вставки добавив row_number.
...
Рейтинг: 0 / 0
UPDATE вместо перечисления
    #40084036
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Wlr-l,

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

можно в книге Ицика Бен-Гана "Microsoft SQL Server 2008. Основы T-SQL", Глава 8. Модификация данных, Присваивание в UPDATE, с. 258.
...
Рейтинг: 0 / 0
UPDATE вместо перечисления
    #40084051
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
UPDATE вместо перечисления
    #40084917
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kostt,

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


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