데이터베이스 호환성 수준(compatibility level)은 데이터베이스 수준 설정 중 하나로, 데이터베이스가 작동하는 방식에 직접적인 영향을 미칩니다. Microsoft® SQL Server®의 새 버전이 출시될 때마다 수많은 새로운 기능이 도입되며, 이들 대부분은 새로운 키워드를 필요로 하고 이전 버전에 존재하던 특정 동작을 변경합니다. Microsoft는 최대한의 하위 호환성을 제공하기 위해 사용자가 필요에 따라 호환성 수준을 자유롭게 설정할 수 있도록 지원합니다.
데이터베이스 호환성 수준 기본값
기본적으로 모든 데이터베이스는 해당 데이터베이스가 생성된 model 데이터베이스 버전의 호환성 수준을 상속받습니다. 예를 들어, SQL Server 2012 데이터베이스의 호환성 수준은 별도로 변경하지 않는 한 기본값인 110으로 설정됩니다.
복원 후 호환성 수준
구버전 SQL Server에서 생성한 데이터베이스 백업을 복원할 때, 원본 인스턴스의 호환성 수준이 최소 지원 수준보다 낮지 않다면 데이터베이스 호환성 수준은 백업을 받았던 인스턴스와 동일하게 유지됩니다. 만약 원본 호환성 수준이 최소 지원 수준보다 낮다면, 데이터베이스 호환성 수준은 가장 낮은 지원 버전으로 변경됩니다. 예를 들어, SQL Server 2005 데이터베이스 백업을 SQL Server 2017에 복원하면, 복원된 데이터베이스의 호환성 수준은 100으로 설정됩니다. 이는 SQL Server 2017에서 지원하는 최소 호환성 수준이 100이기 때문입니다.
업그레이드 후 호환성 수준
업그레이드가 완료되면 tempdb, model, msdb, resource 데이터베이스의 호환성 수준은 현재(새) 호환성 수준으로 설정됩니다. 반면 master 시스템 데이터베이스는 업그레이드 이전의 호환성 수준을 그대로 유지합니다.
호환성 수준 확인 및 변경 방법
현재 호환성 수준을 확인하려면 sys.databases 뷰의 compatibility_level 열을 조회하면 됩니다.
호환성 수준을 다른 값으로 변경하려면 아래 예시와 같이 ALTER DATABASE 명령어를 사용합니다:
Use Master
Go
ALTER DATABASE <database name> SET COMPATIBILITY_LEVEL = <compatibility-level>;
선호한다면 SSMS 마법사(wizard)를 통해 호환성 수준을 변경할 수도 있습니다. 다만, 데이터베이스에 온라인 상태의 사용자가 접속 중이라면 먼저 데이터베이스를 단일 사용자 모드(single-user mode)로 전환해야 합니다. 그런 다음 마법사로 호환성 수준을 변경한 후, 데이터베이스를 다시 다중 사용자 모드(multi-user mode)로 되돌려야 합니다.
마법사로 호환성 수준을 변경하려면 데이터베이스 우클릭 → 속성 → 옵션 → 데이터베이스 호환성 수준 순서로 이동하면 됩니다. 아래 이미지를 참고하세요:

기본 및 지원되는 호환성 수준
아래 표는 SQL Server 버전별 기본 호환성 수준과 지원되는 호환성 수준 목록을 보여줍니다:

출처: https://www.sqlskills.com/blogs/glenn/database-compatibility-level-in-sql-server/
데이터베이스 호환성 수준과 성능
SQL Server 2014 이전 버전에서는 데이터베이스 관리자(DBA)가 성능 관점에서 데이터베이스 호환성 수준을 걱정할 필요가 없었습니다. 당시 호환성 수준은 주로 해당 버전에서 도입된 새로운 기능의 사용 가능 여부를 제어하거나, 더 이상 지원되지 않는 기능을 비활성화하는 메커니즘으로 사용되었으며, 하위 호환성 유지 목적으로도 활용되었습니다.
하지만 이제는 한 버전에서 다른 버전으로 마이그레이션할 때 성능 변화를 파악하기 위해 전체 회귀 테스트(full regression test)를 수행해야 합니다. 경우에 따라서는 마이그레이션 후에도 구버전 호환성 수준에서 쿼리가 더 나은 성능을 보일 수 있습니다. 반대의 경우도 있으므로, 반드시 전체 회귀 테스트를 거쳐야 합니다.
SQL Server 2014부터는 호환성 수준 120 이상에서 실행되는 데이터베이스가 새로운 카디널리티 추정(cardinality estimation) 기능을 활용할 수 있습니다. 카디널리티 추정은 SQL Server가 예상 비용을 기반으로 쿼리를 어떻게 실행할지 결정하는 논리입니다. 이 추정치는 해당 쿼리에 포함된 객체와 연관된 통계(statistics) 입력값을 사용하여 계산됩니다. 실질적으로 높은 수준에서 보면, 카디널리티 추정은 행 수(row count) 추정치에 쿼리에서 참조하는 테이블 및 객체에 담긴 값 분포 정보, 고유 값 개수, 중복 개수 등을 결합한 것입니다. 이러한 추정이 잘못되면 불충분한 메모리 부여(memory grant)로 인한 불필요한 디스크 I/O(TempDB 스풀 등)나 직렬 계획 실행이 병렬 계획 실행 대신 선택되는 문제 등이 발생할 수 있습니다. 카디널리티 추정에 대한 자세한 내용은 다음 블로그 글에서 다룰 예정입니다.
호환성 수준 변경의 영향
호환성 수준을 변경하면 데이터베이스의 기능 집합(feature set)이 달라집니다. 즉, 일부 기능이 추가되는 동시에 일부 구버전 기능은 제거됩니다. 예를 들어, FOR BROWSE 절은 호환성 수준 100에서는 INSERT 및 SELECT INTO 문에서 허용되지 않지만, 호환성 수준 90에서는 허용되더라도 무시됩니다. 애플리케이션이 이 기능을 사용 중이라면 이러한 변경으로 인해 예기치 않은 결과가 발생할 수 있습니다.
데이터베이스를 낮은 호환성 수준에서 높은 호환성 수준으로 이동할 때, 호환성 수준을 변경하지 않으면 새로운 기능을 사용할 수 없다고 생각하기 쉽습니다. 그러나 이것은 완전히 정확한 것은 아닙니다. 이는 데이터베이스 수준 기능에만 해당되는 사실입니다. 인스턴스 수준 기능은 호환성 수준을 변경하지 않아도 사용할 수 있습니다.
결론
데이터베이스 호환성 수준은 SQL Server가 특정 기능을 사용하는 방식을 정의합니다. 구체적으로 말하면, 데이터베이스가 특정 버전의 SQL Server처럼 동작하도록 만드는데, 이는 일반적으로 어느 정도의 하위 호환성을 제공하기 위함입니다. 호환성 수준은 데이터베이스 속성이므로, 해당 특정 데이터베이스의 데이터베이스 수준 기능에만 영향을 미칩니다.
데이터베이스를 더 높은 버전의 서버로 이동하거나 인플레이스(in-place) 인스턴스 업그레이드를 수행하여 업그레이드하는 경우, 해당 호환성 수준이 지원되는 한 호환성 수준은 동일하게 유지됩니다.
호환성 수준이 SQL Server 2014 이상으로 설정되어 있으면 SQL Server는 새로운 카디널리티 추정 기능을 사용합니다. 호환성 수준이 2012 이하로 설정되어 있으면 구버전 옵티마이저가 사용됩니다.
의견이나 질문이 있다면 피드백 탭을 이용해 주세요.
전문가의 관리·운영·구성 서비스로 환경 최적화
Rackspace의 애플리케이션 서비스 (RAS) 전문가들은 폭넓은 애플리케이션 포트폴리오 전반에서 다음과 같은 전문 및 관리형 서비스를 제공합니다:
- e커머스 및 디지털 경험 플랫폼
- 엔터프라이즈 리소스 플래닝(ERP)
- 비즈니스 인텔리전스(BI)
- Salesforce 고객 관계 관리(CRM)
- 데이터베이스
- 이메일 호스팅 및 생산성 솔루션
Rackspace가 제공하는 것:
- 편견 없는 전문성: 즉각적인 가치를 창출하는 역량에 초점을 맞춰 현대화 여정을 단순화하고 안내합니다.
- Fanatical Experience™: "프로세스 우선, 기술 차후(Process first. Technology second.®)" 접근 방식과 전담 기술 지원을 결합하여 종합적인 솔루션을 제공합니다.
- 타의 추종을 불허하는 포트폴리오: 광범위한 클라우드 경험을 바탕으로 올바른 클라우드에 적합한 기술을 선택하고 배포할 수 있도록 돕습니다.
- 애자일한 제공: 고객의 여정 단계에 맞춰 함께하며, 우리의 성공을 고객의 성공과 일치시킵니다.
지금 바로 채팅으로 시작해 보세요.