Выберите MAX (поле) +1 ОТ ... Проблемы с параллелизмом - PullRequest
1 голос
/ 29 октября 2009

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 29 октября 2009

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

https://sqlblog.org/2009/10/12/bad-habits-to-kick-making-assumptions-about-identity

В любом случае, вот синтаксис, который я рекомендую (я не очень доверяю модели 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;

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

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

3 голосов
/ 29 октября 2009

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

CREATE TABLE Test (
    Id int identity primary key not null
    -- ...
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...