내 생각에 그것은 구현으로 인한 제한이었습니다. 여러 테이블에서이 설정을 허용하면 잠재적 인 성능 저하가 발생했습니다.
이는 세션 매개 변수이므로 단일 테이블에서 설정을 활성화 할 수 있다는 것은 서버 측 세션에 저장하기위한 테이블 및 오브젝트 ID가 단순함을 의미합니다. IDENTITY_INSERT가 활성화되어 있지 않으면 0이고 테이블에 대한 databaseid + objectid의 코딩이 하나의 정수일 수도 있습니다.
세션 내에서 여러 테이블에 매개 변수를 설정하면 서버가 해당 오브젝트의 동적 목록을 저장하고 모든 삽입 명령문에 대해이를 점검 함을 의미합니다. 세션이 천 테이블에 대한 매개 변수를 활성화한다고 상상해보십시오.
- 이는 서버가 세션 변수에 1000 개의 항목을 할당했음을 의미합니다.
- 이는 또한 서버가이 세션의 모든 삽입 명령문에 대해 1000 개의 항목 목록을 확인해야 함을 의미합니다.
또한 set identity_insert on이 서버에서 성능 전체 성능에 영향을 미친 것으로 생각됩니다. sybase에는 " Identity Burning Set Factor "가있어 테이블의 ID 카운터 값을 한 번만 저장할 수 있습니다 (값은 메모리에 유지되고 한 번에 서버에 한 번 디스크에 기록됨) 종료). SQL Server는 동일한 코드를 기반으로하기 때문에 비슷한 최적화가있을 수 있지만 테이블에서 identity_insert를 활성화하면 서버가 모든 삽입에 대한 ID 값을 저장하도록 제한 할 수 있습니다. 그렇지 않으면 최대 간격 크기를 보장 할 수 없기 때문입니다. 따라서 하나의 세션이 한 테이블의 삽입에서 성능을 저하시키는 경우 이는 허용되지만 서버의 모든 auto_increment 테이블에서 성능이 저하 될 수는 없습니다.