SQL Server 2017은 2017년 10월에 공식 출시되었습니다. 2016년 말부터 일부 버전이 순차적으로 공개되었으며, 2017년 말까지 총 10번의 릴리스가 이루어졌습니다.
SQL Server 2017의 가장 큰 특징은 바로 리눅스(Linux) 지원입니다. 이제 SQL Server를 리눅스 환경에 설치할 수 있고, 리눅스 기반 도커(Docker) 컨테이너에서도 SQL Server 2017을 사용할 수 있습니다. 또한 개발 언어를 자유롭게 선택할 수 있으며, 온프레미스(on-premise)와 클라우드 환경 모두에서 개발이 가능합니다.
이 버전에서는 데이터베이스 엔진(Database Engine), Integration Services, Master Data Services, Analysis Services 등 각 구성 요소 전반에서 성능, 확장성 및 기능이 크게 향상되었습니다. 이 글에서는 영역별로 하나씩 살펴보겠습니다.
SQL Server 2017의 새로운 기능 한눈에 보기
- 데이터베이스 엔진(Database Engine)의 신기능: identity_cache, 향상된 적응형 쿼리 처리, 자동 튜닝
- 그래프 DB(Graph DB)의 신기능
- Always Available(교차 데이터베이스 액세스)
- DTA(Database Tuning Advisor) 개선
- 새로운 문자열 함수: TRANSLATE, CONCAT_WS, TRIM, STRING_AGG
- SSRS(Reporting Services)의 변화
- SSIS(Integration Services)의 변화
- SSAS(Analysis Services)의 변화
- 머신 러닝(Machine Learning)
- 리눅스(Linux) 지원
데이터베이스 엔진(Database Engine)의 새로운 기능
1. identity_cache

identity_cache 옵션은 서버가 갑자기 종료되거나 장애 조치(failover)가 발생하거나 보조(secondary) 서버로 전환되는 상황에서 IDENTITY 열 값에 불연속성(값 건너뛰기)이 생기는 것을 방지해 줍니다. 이 옵션은 ALTER DATABASE SCOPED CONFIGURATION 명령과 함께 사용하여 데이터베이스 수준의 구성 설정을 활성화합니다. 기본 문법은 다음과 같습니다.
ALTER DATABASE SCOPED CONFIGURATION
{
{ [ FOR SECONDARY ] SET }
| CLEAR PROCEDURE_CACHE
| SET < set_options >
}
[;]
< set_options > ::=
{
MAXDOP = { | PRIMARY }
| LEGACY_CARDINALITY_ESTIMATION = { ON | OFF | PRIMARY }
| PARAMETER_SNIFFING = { ON | OFF | PRIMARY }
| QUERY_OPTIMIZER_HOTFIXES = { ON | OFF | PRIMARY }
| IDENTITY_CACHE = { ON | OFF }
}
2. 향상된 적응형 쿼리 처리(Adaptive Query Processing)
쿼리 성능을 개선하고 싶다면 이 새로운 기능이 큰 도움이 됩니다. SQL Server와 Azure SQL Database에서 모두 지원됩니다.
일반적으로 SQL 쿼리가 실행될 때 최적화 과정은 다음과 같이 진행됩니다.
- 쿼리 옵티마이저(query optimizer)가 해당 쿼리에 대해 가능한 모든 실행 계획(execution plan)을 계산합니다.
- 그중 가장 좋고 빠른 계획을 찾아냅니다.
- 추정된 최적 계획을 선택해 쿼리를 실행하고, 실행 프로세스가 시작됩니다.
하지만 위 과정에는 다음과 같은 단점이 있습니다.
- 잘못된 계획이 최적이라고 추정되면 성능 저하로 이어질 수 있습니다.
- 최적 계획 실행에 필요한 메모리가 부족하게 할당되면 메모리 부족(overflow) 오류가 발생할 수 있습니다.
SQL Server 2017은 이러한 단점을 극복하기 위해 다음 세 가지 기능을 도입했습니다.
- 배치 모드 메모리 피드백(Batch Mode Memory Grant Feedback): 계획 실행에 실제로 필요한 메모리를 재계산하여, 캐시된 정보를 바탕으로 적절한 메모리를 할당합니다.
- 배치 모드 적응형 조인(Batch Mode Adaptive Joins): 조인 방식에는 해시(Hash) 조인과 중첩 루프(Nested Loop) 조인 두 가지가 있습니다. 실행 계획 입력이 처음 스캔될 때 어떤 조인 방식을 적용해야 최적의 속도로 결과를 얻을 수 있는지 동적으로 판단합니다.
- 인터리브드 실행(Interleaved Execution): 최적 계획 실행 중 다중 문 테이블 반환 함수(multi-statement table valued functions)를 만나면 잠시 "일시 중지"하여 해당 테이블의 실제 카디널리티를 정확히 계산한 뒤, 다시 최적화를 진행합니다.
3. 자동 튜닝(Automatic Tuning)
이 기능은 쿼리 성능 문제를 진단하고, 원인을 식별한 뒤 제안된 해결책으로 자동 수정해 줍니다. SQL Server 2017에서 제공되는 자동 튜닝 기법은 다음과 같습니다.
- AUTOMATIC_TUNING (계획 수정): SQL Server 2017 데이터베이스에서 사용할 수 있으며, 쿼리 계획에서 성능 문제를 찾아내고 제안된 해결책으로 자동으로 수정합니다.
- AUTOMATIC_TUNING (인덱스 관리): Azure SQL Database에서 제공되며, 비효율적인 인덱스를 삭제하고 올바른 인덱스를 추가하는 방식으로 인덱스 구성을 식별하고 교정합니다.
그래프 DB(Graph DB)의 새로운 기능
그래프 DB란 무엇인가?
그래프 DB는 기본적으로 노드(node)와 엣지(edge)의 집합입니다. 노드는 개체(entity)를 나타내고, 엣지는 노드 간의 관계를 표현하며 하나의 엣지는 여러 노드와 연결될 수 있습니다. 그래프 DB는 관계형 데이터베이스처럼 동작하며, 다음과 같은 경우에 유용하게 사용할 수 있습니다.
- 계층 구조 형태의 데이터베이스에서 하나의 노드에 여러 부모를 저장해야 하는 경우
- 링크와 데이터 간의 관계를 조회하고 분석해야 하는 경우
- 관계(relationship)가 매우 많은 경우
여기서는 MATCH 키워드를 사용해 그래프 테이블을 쿼리하고 데이터를 정렬할 수 있습니다. 단일 쿼리만으로 그래프 데이터와 관계형 데이터를 함께 조회할 수 있다는 점이 큰 장점입니다.
Always Available(교차 데이터베이스 액세스)
이 기능을 통해 이제 서로 다른 SQL 인스턴스 간에 데이터베이스를 교차 참조할 수 있습니다(한 SQL 인스턴스가 다른 인스턴스에 연결 가능). 분산 데이터베이스 간 교환도 지원합니다. 참고로 SQL Server 2016에서도 교차 데이터베이스 액세스가 가능했지만, 같은 SQL Server 내 인스턴스 간에만 허용되었습니다.
DTA(Database Tuning Advisor) 개선 사항
SQL Server 2017에서는 DTA(Database Tuning Advisor)의 성능이 개선되었고, 새로운 옵션들이 추가되었습니다.
DTA를 처음 들어보셨다면 간단히 설명하겠습니다. DTA는 쿼리를 처리한 후 성능 개선 방안을 제안하는 데이터베이스 도구로, 필요에 따라 데이터베이스 구조(예: 인덱스, 파티션 등) 변경을 권장합니다. DTA는 다음 두 가지 방식으로 사용할 수 있습니다.
- GUI(그래픽 인터페이스)를 통한 사용
- 명령줄 유틸리티(dta.exe)를 통한 사용
새로운 문자열 함수
SQL Server 2017은 TRANSLATE, CONCAT_WS, TRIM, STRING_AGG와 같은 새로운 문자열 함수를 제공합니다. 각 함수를 하나씩 살펴보겠습니다.
TRANSLATE
TRANSLATE 함수는 문자열을 입력받아 지정한 문자들을 다른 문자로 변환합니다. 문법은 다음과 같습니다.
TRANSLATE ( inputString, characters, translations )
'characters'와 'translations'의 길이는 반드시 같아야 하며, 그렇지 않으면 오류가 반환됩니다. 예를 들어:
TRANSLATE ( '6 * {10 + 10} / [6-4]', '[]{}', '()' )
위 예제의 결과는 6 * (10 + 10) / (6-4) 입니다. 중괄호와 대괄호가 소괄호로 변환된 것을 확인할 수 있습니다.
이 함수는 REPLACE 함수와 유사한 메커니즘이지만, 훨씬 간결하게 사용할 수 있습니다. 예를 들어 REPLACE 함수로 동일한 결과를 얻으려면 아래처럼 작성해야 하므로 한눈에 알아보기 어렵습니다.
SELECT REPLACE(REPLACE(REPLACE(REPLACE('6 * {10 + 10} / [6-4]', '{', '('), '}', ')'), '[', '('), ']', ')');
CONCAT_WS
CONCAT_WS 함수는 지정한 구분자(separator)를 사용해 모든 입력 인수를 하나의 문자열로 연결합니다. 문법은 다음과 같습니다.
CONCAT_WS ( separator, argument1 [, argumentN]... )
구분자를 기준으로 모든 인수를 연결한 단일 문자열을 생성하며, 출력을 위해 최소 2개의 인수가 필요합니다. 그렇지 않으면 오류가 반환됩니다. 예를 들어:
SELECT CONCAT_WS(',', 'one', 'two', 'three', 'four') AS counter;
위 명령의 결과는 one,two,three,four 입니다.
또한 문자열 대신 데이터베이스 열 이름을 인수로 사용할 수도 있습니다.
TRIM
SQL Server 2017에서 마침내 TRIM 함수가 등장했습니다. C#의 trim 함수처럼 문자열 앞뒤의 불필요한 공백을 모두 제거합니다. 문법은 다음과 같습니다.
SELECT TRIM( ' trim me ' ) AS result;
위 명령의 결과는 trim me 입니다.
단, 이 함수는 문자열 중간에 있는 공백은 제거하지 않습니다.
STRING_AGG
STRING_AGG 함수는 구분자를 사용해 문자열 값을 연결하며, 문자열 끝에는 구분자를 추가하지 않습니다. 입력 데이터는 VARCHAR, NVARCHAR 형식이며, WITHIN GROUP 절을 사용해 결과의 정렬 순서를 지정할 수 있습니다.
문법은 다음과 같습니다.
STRING_AGG ( expression, separator ) [ WITHIN GROUP ( ORDER BY[ ASC | DESC ] ) ]
다음 예제를 참고하세요.
SELECT city,
STRING_AGG(name, ';') WITHIN GROUP (ORDER BY name ASC) AS names
FROM Students
GROUP BY city;
위 예제에서는 모든 이름이 세미콜론(;)으로 연결되었으며, WITHIN GROUP 절 덕분에 이름순으로 정렬되었습니다. 반환 결과는 다음과 같이 표시됩니다.

SSRS(Reporting Services)의 새로운 기능
- 이제부터 SSRS 설치는 SQL Server 설치 프로그램에 포함되지 않으며, 별도로 다운로드 센터에서 내려받아 설치해야 합니다.
- 쿼리 디자이너(Query Designer)가 DAX를 지원합니다. SSAS(Analysis Services)를 대상으로 네이티브 DAX 쿼리를 직접 작성할 수 있으며, 이 기능은 최신 SQL 도구 및 Report Builder 업데이트에서 제공됩니다.
- RESTful API가 SSRS에서 공식 지원되어 OpenAPI 명령을 사용할 수 있습니다.
- 이제 댓글(comment)에 파일을 첨부할 수 있습니다.
- 보고서(report)에 댓글을 달 수도 있습니다.
- Reporting Service 웹 포털이 대폭 개선되었습니다(이 기능은 SQL 2016에서도 일부 제공).
SSIS(Integration Services)의 새로운 기능
이제 리눅스에서도 SSIS를 실행할 수 있어, 대용량 데이터를 리눅스 환경에서 직접 추출(extract)하고 변환(transform)할 수 있습니다.
새로 도입된 스케일 아웃(Scale Out) 기능은 고성능 머신 여러 대로 구성된 복잡한 통합 시스템을 지원합니다. Scale Out Master와 Scale Out Worker의 협업을 통해 모든 패키지 실행 작업을 처리합니다.
SSAS(Analysis Services)의 새로운 기능
- MS Excel, Power BI와 유사한 새로운 Get Data 인터페이스가 SQL 2017에 도입되었습니다. 데이터 변환(data transformation)과 데이터 매시업(data mashup) 기능도 함께 제공되며, 쿼리 편집기와 M 식(expression)을 사용해 구현할 수 있습니다.
- SQL 2012에서 처음 선보인 SSAS의 테이블 형식(Tabular) 모드가 SQL 2017에서 대폭 업그레이드되었습니다.
- 대용량 인메모리(in-memory) 테이블 데이터를 최적화하기 위한 새로운 인코딩 힌트(Encoding Hints)가 제공됩니다.
- PIVOT 연산의 성능이 향상되었습니다.
머신 러닝(Machine Learning)
SQL Server 2016이 R 서비스(R Services)를 지원한다는 것은 이미 잘 알려져 있는데, SQL Server 2017부터는 이 서비스의 이름이 SQL Server Machine Learning Services로 변경되었습니다. 이 덕분에 SQL Server에서 R 또는 Python 명령 체계를 손쉽게 활용할 수 있습니다.
새 기능을 통해 Python이 저장 프로시저(stored procedure) 안에서 실행될 수 있으며, SQL Server를 통해 원격으로 명령을 실행할 수도 있습니다. Python 개발자에게 매우 유용한 기능입니다. 다만 이 기능은 아직 리눅스에서는 지원되지 않으므로, 다음 업그레이드를 기다려야 합니다.
머신 러닝을 더 효율적이고 최적화된 방식으로 사용하기 위해 SQL Server는 다음 솔루션을 제공합니다.
- revoscalepy: 고성능 알고리즘, 컴퓨팅, 원격 실행 시나리오를 위한 기반이 되는 새로운 라이브러리입니다. 기본적으로 RevoScaleR(R 서비스 패키지) 플랫폼을 기반으로 합니다.
- microsoftml: Microsoft R Server용 머신 러닝 알고리즘을 지원하는 라이브러리로, Microsoft가 사내 머신 러닝 작업을 위해 개발했습니다. 지난 몇 년간 꾸준히 개선되어 현재는 빠른 데이터 변환과 대용량 문서 처리 등도 지원합니다.
리눅스(Linux) 지원
"SQL Server 2017 on Linux and Windows"라는 명칭에서 알 수 있듯이, 이번 업그레이드의 핵심 목표는 리눅스 플랫폼에서의 제품 출시 지원입니다. "SQL on Linux"의 주요 기능은 다음과 같습니다.
- 핵심 데이터베이스 엔진 저장 기능
- IPv6 지원
- NFS 지원
- 리눅스에서 Active Directory(AD) 인증
- 암호화(Encryption) 지원
- 리눅스에 SSIS 설치 가능
- mssql-conf 명령줄 도구 제공
- 간소화되고 자유로운 설치 프로세스
- Visual Studio Code용 SQL 확장 지원(VS Code는 리눅스에서 사용 가능)
- 크로스 플랫폼 스크립트 생성기
마무리
SQL Server에 대해 배울 내용은 아직 많습니다. 다음 시리즈에서도 이 여정을 이어가겠습니다. 궁금한 점이나 의견이 있다면 언제든지 댓글로 남겨주세요!
함께 읽으면 좋은 글
- Windows에서 리눅스 소프트웨어를 실행하는 7가지 방법
- Windows와 Linux의 8가지 핵심 차이점
- MS SQL Server에서 데이터베이스 로그인하는 방법
- MS SQL Server에서 서비스 시작 및 중지하는 방법