Meu palpite é que isso foi uma restrição devido à implementação. Permitir essa configuração em várias tabelas foi um possível sucesso de desempenho:
Como esse é um parâmetro da sessão, permitir que a configuração seja ativada em uma única tabela significa que é um sinalizador simples e o ID do objeto da tabela para armazenar na sessão, no lado do servidor. Talvez este seja apenas um único número inteiro: 0 se nenhum IDENTITY_INSERT estiver ativo e alguma codificação de databaseid + objectid para a tabela.
Permitir que o parâmetro seja definido em várias tabelas em uma sessão significaria que o servidor armazenaria uma lista dinâmica de tais objetos e a verificaria para todas as instruções de inserção. Imagine que uma sessão ativa o parâmetro para mil tabelas:
- Isso significa que o servidor alocou 1000 itens na variável de sessão
- Isso significa também que o servidor deve verificar a lista dos 1000 itens para cada instrução de inserção nesta sessão.
Além disso, suspeito que o conjunto identity_insert on tenha um desempenho atingido no servidor. Na sybase, havia um " fator de conjunto de gravação de identidade ", que permitia salvar o valor do contador de identidade de uma tabela para ser salvo apenas de vez em quando (o valor é mantido na memória e gravado no disco de vez em quando e no servidor desligar ). O SQL Server é baseado no mesmo código, portanto, provavelmente possui uma otimização comparável, mas a ativação de identity_insert em uma tabela provavelmente restringe o servidor a salvar o valor da identidade para cada inserção, pois, caso contrário, não pode garantir um tamanho máximo de espaço. Portanto, se uma sessão faz um impacto no desempenho nas inserções em uma tabela, isso provavelmente é aceitável, mas não se ele pode causar o desempenho em todas as tabelas de incremento automático no servidor.