Supongo que fue una restricción debido a la implementación. Permitir esta configuración en varias tablas fue un éxito potencial:
Dado que este es un parámetro de sesión, permitir que la configuración se active en una sola tabla significa que es un indicador simple y la identificación del objeto de la tabla para almacenar en la sesión, del lado del servidor. Tal vez esto sea solo un número entero: 0 si no hay IDENTITY_INSERT activo, y alguna codificación de databaseid + objectid para la tabla.
Permitir que el parámetro se establezca en varias tablas dentro de una sesión significaría que el servidor almacenaría una lista dinámica de dichos objetos y la verificaría para cada instrucción de inserción. Imagine que una sesión activa el parámetro para mil tablas:
- Esto significa que el servidor ha asignado 1000 elementos en la variable de sesión
- Esto significa también que el servidor tiene que verificar la lista de los 1000 elementos para cada instrucción de inserción en esta sesión.
También sospecho que set identity_insert on tiene un impacto de rendimiento amplio en el servidor. En Sybase había un " factor de configuración de grabación de identidad ", que permitía guardar el valor del contador de identidad de una tabla para guardarlo solo de vez en cuando (el valor se guarda en la memoria y se escribe en el disco de vez en cuando y en el servidor apagar ). SQL Server se basa en el mismo código, por lo que probablemente tenga una optimización comparable, pero la activación de identity_insert en una tabla probablemente restringe al servidor a guardar el valor de identidad para cada inserción, porque de lo contrario no puede garantizar un tamaño de espacio máximo. Entonces, si una sesión produce un impacto en el rendimiento de las inserciones en una tabla, esto probablemente sea aceptable, pero no si puede hacer que el rendimiento se vea afectado en todas las tablas de aumento automático en el servidor.