Azure SQL Database에서 메모리 내 OLTP를 사용하여 애플리케이션의 성능 개선

적용 대상:Azure SQL Database

메모리 내 OLTP를 사용하면 가격 책정 계층을 높이지 않고도 프리미엄 및 중요 비즈니스용 계층 데이터베이스에서 트랜잭션 처리, 데이터 수집 및 일시적인 데이터 시나리오의 성능을 개선할 수 있습니다.

다음 단계를 수행하여 기존 데이터베이스에서 메모리 내 OLTP를 채택합니다.

1단계: 프리미엄 또는 중요 비즈니스용 계층 데이터베이스를 사용하고 있는지 확인

메모리 내 OLTP는 Azure SQL Database의 프리미엄(DTU) 및 중요 비즈니스용(vCore) 계층에서만 지원합니다. 반환된 결과가 1인 경우(0이 아님) 메모리 내 OLTP를 지원합니다.

SELECT DatabasePropertyEx(Db_Name(), 'IsXTPSupported');

XTP고성능 트랜잭션 처리(Extreme Transaction Processing)의 약어입니다.

2단계: 메모리 내 OLTP로 마이그레이션할 개체 식별

SQL Server Management Studio(SSMS)에는 활성 워크로드가 있는 데이터베이스에 대해 실행할 수 있는 트랜잭션 성능 분석 개요 보고서가 포함되어 있습니다. 이 보고서에서는 메모리 내 OLTP로 마이그레이션할 후보 테이블 및 저장 프로시저를 식별합니다.

SSMS에서 보고서를 생성합니다.

  • 개체 탐색기에서 데이터베이스 노드를 마우스 오른쪽 단추로 클릭합니다.
  • 보고서>표준 보고서>트랜잭션 성능 분석 개요를 선택합니다.

메모리 내 OLTP의 이점 평가에 대한 자세한 내용은 테이블 또는 저장 프로시저가 메모리 내 OLTP로 이식되어야 하는지 결정을 참조하세요.

3단계: 비교 가능한 테스트 데이터베이스 만들기

데이터베이스에 메모리 최적화 테이블로 변환하면 도움이 되는 테이블이 있음을 보고서에서 표시한다고 가정합니다. 먼저 테스트하여 해당 내용을 확인하는 것이 좋습니다.

프로덕션 데이터베이스의 테스트 복사본이 필요합니다. 테스트 데이터베이스의 서비스 계층 수준은 프로덕션 데이터베이스와 동일해야 합니다.

쉽게 테스트하려면 테스트 데이터베이스를 다음과 같이 조정합니다.

  1. SQL Server Management Studio(SSMS)를 사용하여 데이터베이스에 연결합니다.

  2. 쿼리에서 WITH (SNAPSHOT) 옵션이 필요하지 않도록 하려면 다음 T-SQL 문에 표시된 대로 현재 데이터베이스의 MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT 옵션을 설정합니다.

    ALTER DATABASE CURRENT
     SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
    

4단계: 테이블 마이그레이션

테스트하려는 테이블의 메모리 최적화 복사본을 생성하고 채워야 합니다. 다음 방법 중 하나로 생성할 수 있습니다.

SSMS의 메모리 최적화 마법사

이 마이그레이션 옵션을 사용하려면 다음을 수행합니다.

  1. SSMS에서 데이터베이스에 연결합니다.

  2. 개체 탐색기에서 테이블을 마우스 오른쪽 단추로 클릭하고 메모리 최적화 관리자를 선택합니다.

    테이블 메모리 최적화 관리자 마법사가 표시됩니다.

  3. 마법사에서 마이그레이션 유효성 검사(또는 다음 버튼)를 선택하여 테이블에 메모리 최적화 테이블에서 지원되지 않는 지원되지 않는 기능이 있는지 확인합니다. 자세한 내용은 다음을 참조하세요.

  4. 테이블에 지원되지 않는 기능이 없는 경우 어드바이저는 실제 스키마 및 데이터 마이그레이션을 자동으로 수행할 수 있습니다.

수동 T-SQL

이 마이그레이션 옵션을 사용하려면 다음을 수행합니다.

  1. SSMS(또는 유사한 유틸리티)를 사용하여 테스트 데이터베이스에 연결합니다.
  2. 테이블 및 해당 인덱스에 대한 전체 T-SQL 스크립트를 가져옵니다.
    • SSMS에서 테이블 노드를 마우스 오른쪽 단추로 클릭합니다.
    • 스크립트 테이블 형식>생성 위치>새 쿼리 창을 선택합니다.
  3. 스크립트 창에서 CREATE TABLE 문에 WITH (MEMORY_OPTIMIZED = ON)을 추가합니다.
  4. CLUSTERED 인덱스가 있는 경우 NONCLUSTERED로 변경합니다.
  5. sp_rename을 사용하여 기존 테이블의 이름을 바꿉니다.
  6. 편집된 CREATE TABLE 스크립트를 실행하여 테이블의 새 메모리 최적화 복사본을 생성합니다.
  7. INSERT...SELECT * INTO를 사용하여 메모리 최적화 테이블에 데이터를 복사합니다.
    INSERT INTO [<new_memory_optimized_table>]
            SELECT * FROM [<old_disk_based_table>];
    

5단계(선택 사항): 저장 프로시저 마이그레이션

메모리 내 기능은 성능 향상을 위해 저장 프로시저를 수정할 수도 있습니다.

네이티브 컴파일된 저장 프로시저에 대한 고려 사항

네이티브 컴파일된 저장 프로시저에는 해당 T-SQL WITH 절에 다음 옵션이 있어야 합니다.

  • NATIVE_COMPILATION: 프로시저의 Transact-SQL 문이 효율적인 실행을 위해 모드 네이티브 코드로 컴파일됨을 의미합니다.
  • SCHEMABINDING: 저장 프로시저를 삭제하지 않는 한 테이블에서 저장 프로시저에 영향을 주는 방식으로 열 정의를 변경할 수 없음을 의미합니다.

네이티브 모듈은 트랜잭션 관리에 하나의 큰 ATOMIC 블록 을 사용해야 합니다. 명시적 BEGIN TRANSACTION 또는 ROLLBACK TRANSACTION. 역할이 없습니다. 코드에서 비즈니스 규칙 위반을 감지하는 경우 THROW 문으로 Atomic 블록을 종료할 수 있습니다.

네이티브 컴파일을 위한 일반 CREATE PROCEDURE

일반적으로 네이티브 컴파일된 저장 프로시저를 생성하는 T-SQL은 다음 템플릿과 유사합니다.

CREATE PROCEDURE schemaname.procedurename
    @param1 type1, ...
    WITH NATIVE_COMPILATION, SCHEMABINDING
    AS
        BEGIN ATOMIC WITH
            (TRANSACTION ISOLATION LEVEL = SNAPSHOT,
            LANGUAGE = N'<desired sys.syslanuages.sysname value>'
            )
        ...
        END;
  • TRANSACTION_ISOLATION_LEVEL의 경우 SNAPSHOT은 네이티브 컴파일된 저장 프로시저의 가장 일반적인 값입니다. 그러나 다른 값의 하위 집합에서도 지원됩니다.
    • REPEATABLE READ
    • 직렬화 가능
  • LANGUAGE 값은 sys.syslanguages 뷰의 name 열에 있어야 합니다. 예들 들어 N'us_english'입니다.

저장 프로시저를 마이그레이션하는 방법

마이그레이션 단계는 다음과 같습니다.

  1. CREATE PROCEDURE 스크립트를 일반 해석 저장 프로시저로 가져옵니다.
  2. 이전 템플릿에 맞게 해당 헤더를 다시 작성합니다.
  3. 저장 프로시저 T-SQL 코드가 네이티브 컴파일된 저장 프로시저에서 지원되지 않는 기능을 사용하는지 여부를 확인합니다. 필요한 경우 해결 방법을 구현합니다. 자세한 내용은 네이티브 컴파일된 저장 프로시저 마이그레이션 문제를 참조하세요.
  4. sp_rename을 사용하여 이전 저장 프로시저의 이름을 바꿉니다. 또는 삭제합니다.
  5. 편집된 CREATE PROCEDURE T-SQL 스크립트를 실행합니다.

6단계: 테스트에서 워크로드 실행

프로덕션 데이터베이스에서 실행되는 워크로드와 유사한 테스트 데이터베이스에서 워크로드를 실행합니다. 이렇게 하면 테이블 및 저장 프로시저에 대한 메모리 내 기능을 사용할 때 성능이 향상됩니다.

워크로드의 주요 특성은 다음과 같습니다.

  • 동시 연결 수.
  • 읽기/쓰기 비율.

테스트 워크로드를 조정하고 실행하려면 간편한 ostress.exe 도구를 사용하는 것이 좋습니다. 자세한 내용은 Azure SQL Database의 메모리 내 샘플을 참조하세요.

네트워크 대기 시간을 최소화하려면 데이터베이스가 있는 동일한 Azure 지역에서 테스트를 실행합니다.

7단계: 사후 실현 모니터링

프로덕션에서 메모리 내 구현의 성능 효과를 모니터링하는 것이 좋습니다.