소개
이 주제 관련해서 MS Doc, 검색 자료, GPT 문답을 통해 2022에서의 새로운 또는 개선된 기능을 알아봤지만 직접 확인해 볼 수 있는 구체적인 내용은 많지 않았습니다. 그래서 우선은 문서나 자료 상의 특징 등을 나열하고 그 중 중요한 몇 가지 항목만 자세히 알아보겠습니다.
In-Memory OLTP의 SQL Server 2022에서 새로운 또는 확장된 기능 목록 나열
- 더 빨라진 시작 시간
- 메모리 처리 성능 향상
- 메모리 사용량 최적화
- 메모리 할당 및 해제 성능 향상
- 저장 프로시저 성능과 확장성 개선
- Out-of-Memory 상황 완화
- 메모리 수동 Cleanup용 신규 프로시저 지원
참고 자료
혹시 In-Memory OLTP를 잘 모르신다면 아래 MS 문서를 참고하세요.
Out-of-Memory 상황(조건) 완화
SQL Server에 In-Memory OLTP를 실제 적용하는 경우 서비스 관리 상 중요 이슈 중에 하나가 바로 메모리 부족(Out-of-Memory) 오류입니다, 그 경우 서비스가 중단될 수도 있습니다 그 만큼 심각할 수 있는 것이죠. 만일 SQL Server Enterprise Edition이라면 리소스 관리자(Resource Governor) 기능과 연계해서 메모리 동적으로 늘려줄 수도 있고 그러한 시나리오에 대비가 필요한 것이죠.
SQL Server 2022에서는 이러한 상황(조건)이 완화되도록 아래와 같이 개선되었다고 합니다(ChatGPT 답변 참조).
- 메모리 자원 동적 할당 및 해제 작업 개선
- 메모리 양을 보다 효율적으로 관리
- 메모리 관리 및 최적화
- In-Memory OLPT 테이블 및 인덱스 메모리 사용을 최적화하는 알고리즘 개선으로 메모리 누수 방지 및 성능 향상
- 자동 및 수동 cleanup 프로세스 개선
- 더 효율적인 가비지 수집(Garbage Collection) 및 메모리 관리로 메모리 부족 상황 대처에 도움
- 수동 cleanup용 시스템 저장 프로시저 지원
메모리 수동 cleanup용 신규 프로시저 추가 (SQL Server 2022 CU1, 2019 CU13)
sys.sp_xtp_force_gc
메모리 관리는 SQL Server에 의해서 자동으로 처리되지만 이제 수동으로도 In-Memory OLTP용 메모리를 최적화할 수 있도록 시스템 프로시저를 지원합니다, 이는 다음과 같은 작업이 수행됩니다,
- In-Memory OLTP 테이블 GC(Garbage Collection, 가비지 메모리 수집) 수행 후 메모리 최적화
- 불필요한 행이나 버전이 메모리에서 해제 후 메모리 리소스 반환
따라서 다음과 같은 상황에서 수동 cleanup을 고려할 수 있습니다,
- In-Memory OLTP 테이블의 데이터가 자주 변경된 경우
- 메모리 사용량이 예상보다 많은 경우
- 시스템 부하가 증가하여 성능 최적화가 필요한 경우
단, 이러한 작업 시 SQL Server 리소스 사용량에 대한 모니터링은 반드시 병행해야합니다.
자 그러면 간단한 데모로 동작을 확인해보겠습니다. 우선 In-Memory OLTP용 DB는 구성된 상태라고 가정하겠습니다,
-- In-Memory OLTP 테이블 생성 CREATE TABLE dbo.OrdersIM ( ORDERKEY int NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH(BUCKET_COUNT = 2000000), CUSTKEY int NOT NULL, ORDERSTATUS char(2) NOT NULL, TOTALPRICE decimal(15, 2) NOT NULL, ...... ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY); -- 약 1백만건 입력 INSERT dbo.OrdersIM SELECT TOP(1000000) ORDERKEY, CUSTKEY, ORDERSTATUS, TOTALPRICE, ORDERDATE, CLERK, SHIPPRIORITY, COMMENT, NULL FROM dbo.Orders; -- 50만건 업데이트 UPDATE TOP(500000) o SET C_Name = 'Jungsun' FROM dbo.OrdersIM AS o -- 메모리 크기 확인, 아래 [그림-A] 참조 select OBJECT_NAME(object_id), * from sys.dm_db_xtp_table_memory_stats select OBJECT_NAME(object_id), * from sys.dm_db_xtp_memory_consumers -- 수동으로 GC 수행 (MS 문서에 @database_name이 @dbname으로 잘못 표기되어 있음) EXEC sys.sp_xtp_force_gc @database_name = 'Sales_InMem' -- 다시 메모리 크기 확인, 아래 [그림-B] 참조 select OBJECT_NAME(object_id), * from sys.dm_db_xtp_table_memory_stats select OBJECT_NAME(object_id), * from sys.dm_db_xtp_memory_consumers
sys.dm_xtp_system_memory_consumers DMV에서 memory-optimized tempdb 메타 데이터 정보도 개선됨.
[그림-A] UPDATE 후 약 240Mb 크기 사용됨
[그림-B] 수동 GC Cleanup후 메모리 크기, 약 160Mb
정리
SQL Server에 In-Memory OLTP를 적용한 기업이 많을까? 제가 속한 (주)씨퀄로에서 만난 고객 수로 미루어 추정해 보면 매우 적을 것입니다. 제가 좋아하는 Columnstore와 함께 많이 활용되지 못해 아쉬운 기능 중에 하나입니다만, SQL Server 또는 In-Memory 사용하는 기업에서는 지속적으로 개선되는 부분들이 도움이 되었으면 하는 바램입니다.
참고. 간단하게 내용을 살펴보고 개인적으로 테스트를 돌려봤습니다. 테스트는 공증된 것이 아닌 저의 임의의 시나리오이므로 부정확할 수도 있습니다 차후 확인되면 다시 정정하겠습니다.모두 즐거운 SQL하세요.
김정선 드림