Выберите MAX (поле) +1 FROM … Проблемы параллелизма

Привет, я боюсь, что параллелизм в партнерском приложении вызывает в последние дни проблемы с операциями CRUDS, особенно со вставками. Поэтому я запустил SQL Profiler и заметил, что его оператор insert не использует транзакцию, а также использует:

INSERT INTO TABLEA VALUES ( (SELECT MAX(NUMBERFIELD) +1 FROM TABLEA), ....); 

Как избежать использования MAX () + 1 для генерации первичных ключей? Я предлагаю использовать автоинкрементные или транзакционные области, но он не хочет, или, может быть, он не знает, как этого достичь, есть ли другой способ для этого?

Использование SQL и C ++ 1.1

* Его не мой код, но я мог бы подумать, покажу ему этот пост, потому что я думаю, что он должен учитывать, что все мнения приветствуются. 🙂

Если вы правильно это сформулируете, вы сможете получить такую ​​же параллельность из этого, как с решением IDENTITY. Это не интуитивно; вы могли бы подумать, что блокировка уменьшит параллелизм. Но я провел несколько тестов с пятью различными соединениями, забирая стол, и показал себе, что трюк MAX + 1 работает примерно так же, как IDENTITY. Вы можете ознакомиться с обсуждением в первом разделе следующего сообщения в блоге:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/bad-habits-to-kick-expecting-identity-to-mean-something.aspx

Во всяком случае, вот синтаксис, который я рекомендую (я действительно не доверяю модели INSERT … VALUES (SUBQUERY), извините):

  DECLARE @NextID INT; BEGIN TRANSACTION; SELECT @NextID = COALESCE(MAX(NumberColumn), 0) + 1 FROM dbo.TableA WITH (UPDLOCK); INSERT dbo.TableA SELECT @NextID; COMMIT TRANSACTION; 

Вы должны представить части обработки ошибок (опущены для краткости), но я думаю, что вы получите дрейф.

Разумеется, для Евангелия это не принимается. Вам нужно будет запустить тесты на вашем оборудовании, используя ваши данные и шаблоны доступа, чтобы определить, будет ли этот метод нарушен параллелизм. Это вполне может быть одним из ответов «это зависит».

Рассматривали ли вы создание первичного ключевого столбца IDENTITY ? Это заставит SQL Server автоматически генерировать значения для столбца:

 CREATE TABLE Test ( Id int identity primary key not null -- ... ) 
Interesting Posts

Использовать результаты хранимой процедуры в разделе Where

Linq EF group, чтобы получать последние записи в список объектов

Запуск хранимой процедуры с ошибкой пакета NodeJS и MSSQL

разница в производительности между пользовательской функцией и хранимыми процедурами

Как найти имя ненулевых ограничений в SQL Server

Ошибка входа в tsql, но студия управления может подключиться

SQL Server: установите дату на SQL-сервере, но оставайтесь детерминированным

case case in where where

Переменные SQL-сессии / соединения

SQL Server: не удается получить доступ к временным таблицам

Как исключить общее значение критерия из группы

Более элегантный способ выполнения математики по столбцам

Не удается подключиться к godaddy MySQL с java

SQL Server – поиск записей, которые появились 3 раза за последние 30 дней

Обновление таблицы с использованием объединения и использование определенного типа таблицы

Давайте будем гением компьютера.