Я думаю, что это было ограничение из-за реализации. Разрешение этого параметра для нескольких таблиц было потенциальным ударом производительности:
Поскольку это параметр сеанса, разрешение активировать настройку для одной таблицы означает, что это простой флаг и идентификатор объекта таблицы для хранения в сеансе на стороне сервера. Может быть, это всего лишь одно целое число: 0, если IDENTITY_INSERT не активен, и некоторое кодирование databaseid + objectid для таблицы.
Разрешение установки параметра для нескольких таблиц в течение сеанса будет означать, что сервер будет хранить динамический список таких объектов и проверять его для каждого оператора вставки. Представьте себе, что сеанс активирует параметр для тысячи таблиц:
- Это означает, что сервер выделил 1000 элементов в переменной сеанса
- Это также означает, что сервер должен проверять список из 1000 элементов для каждого оператора вставки в этом сеансе.
Также я подозреваю, что set identity_insert имеет снижение производительности на сервере. В sybase существовал « коэффициент набора идентификаторов записи », который позволял сохранять значение счетчика идентификаторов таблицы, которая будет сохраняться только время от времени (значение сохраняется в памяти и время от времени записывается на диск и на сервер. неисправность ). SQL Server основан на том же коде, поэтому, вероятно, имеет некоторую сопоставимую оптимизацию, но активация identity_insert для таблицы, вероятно, заставляет сервер сохранять значение идентификатора для каждой вставки, поскольку в противном случае он не может гарантировать максимальный размер зазора. Поэтому, если один сеанс снижает производительность вставок в одной таблице, это, вероятно, приемлемо, но не в том случае, если он может повлиять на производительность всех таблиц auto_increment на сервере.