Azure SQL Managed Instance의 메모리 내 기술을 사용하여 성능 최적화

적용 대상:Azure SQL Managed Instance

메모리 내 기술을 사용하면 애플리케이션의 성능을 향상시키고, SQL Managed Instance의 비용 감소가 예상됩니다. 메모리 내 OLTP는 Azure SQL Managed Instance의 중요 비즈니스용 서비스 계층에서 사용할 수 있습니다.

메모리 내 기술을 사용하는 경우

메모리 내 기술을 사용하여 다양한 워크로드에서 성능을 향상시킬 수 있습니다.

  • 트랜잭션(OLTP(온라인 트랜잭션 처리)). 여기서 대부분의 요청은 작은 데이터 집합을 읽거나 업데이트합니다(예: CRUD(생성, 읽기, 업데이트, 삭제) 작업).
  • 분석(OLAP(온라인 분석 처리)). 여기서 대부분의 쿼리는 보고 목적으로 복잡한 계산을 수행하고 부하 또는 대량 로드 작업을 수행하거나 기존 테이블에 데이터 변경 내용을 기록하는 정기적으로 예약된 프로세스도 포함합니다. 종종 OLAP 워크로드는 OLTP 워크로드에서 주기적으로 업데이트되곤 합니다.
  • 혼합(HTAP(하이브리드 트랜잭션/분석 처리)) 여기서 두 OLTP 및 OLAP 쿼리는 동일한 데이터 세트에서 실행됩니다.

메모리 내 기술은 쿼리의 네이티브 컴파일 또는 기본 하드웨어에서 사용할 수 있는 일괄 처리와 SIMD 명령과 같은 고급 처리를 사용하여 메모리로 처리해야 하는 데이터를 유지함으로써 이러한 워크로드의 성능을 개선할 수 있습니다.

개요

Azure SQL Managed Instance는 다음과 같은 메모리 내 기술을 지원합니다.

  • 메모리 내 OLTP는 초당 트랜잭션의 수를 증가시키고 트랜잭션 처리에 대한 대기 시간을 감소시킵니다. 메모리 내 OLTP의 혜택에 해당하는 시나리오: 거래 및 게임, 이벤트 또는 IoT 디바이스에서 데이터 수집, 캐싱, 데이터 로드, 임시 테이블 과 테이블 변수 시나리오와 같은 처리량이 높은 트랜잭션 처리.
  • 클러스터형 columnstore 인덱스는 스토리지 공간을 줄이고(최대 10배) 보고 및 분석 쿼리 성능을 개선합니다. 데이터베이스에 있는 더 많은 데이터에 적합한 데이터 마트에서 팩트 테이블과 함께 이 기능을 사용하여 성능을 개선할 수 있습니다. 또한 운영 데이터베이스에서 보관할 기록 데이터와 함께 사용하여 최대 10배 더 많은 데이터를 쿼리할 수 있습니다.
  • HTAP에 대한 비클러스터형 columnstore 인덱스를 사용하면 비용이 많이 드는 ETL(추출, 변환 및 로드) 프로세스를 실행하고 데이터 웨어하우스가 채워질 때까지 기다릴 필요 없이 운영 데이터베이스를 직접 쿼리하여 비즈니스에 대한 실시간 인사이트를 얻을 수 있습니다. 비클러스터형 Columnstore 인덱스를 사용하면 운영 워크로드에 미치는 영향을 줄이는 동시에 OLTP 데이터베이스에 대한 분석 쿼리를 빠르게 실행할 수 있습니다.
  • HTAP에 대한 메모리 최적화 클러스터형 columnstore 인덱스를 사용하면 트랜잭션 처리를 빠르게 수행하고 동일한 데이터에서 분석 쿼리를 매우 신속하게 동시 실행할 수 있습니다.

Columnstore 인덱스와 메모리 내 OLTP는 각각 2012년과 2014년에 SQL Server에 도입되었습니다. Azure SQL Database, Azure SQL Managed Instance 및 SQL Server는 모두 동일한 메모리 내 기술을 구현합니다.

참고 항목

AdventureWorksLT 샘플 데이터베이스 및 ostress.exe를 사용하여 메모리 내 OLTP 기술의 성능 이점을 보여주는 자세한 단계별 자습서는 Azure SQL Managed Instance의 메모리 내 샘플을 참조하세요.

메모리 내 기술의 혜택

보다 효율적인 쿼리 및 트랜잭션 처리로 인해 메모리 내 기술은 비용을 절감하는 데도 도움이 됩니다. Azure SQL Managed Instance의 중요 비즈니스용 서비스 계층이라면 일반적으로 성능 향상을 위해 SQL Managed Instance를 업그레이드할 필요가 없습니다. 경우에 따라 메모리 내 기술로 성능을 개선하면서 가격 책정 계층을 줄일 수도 있습니다.

이 문서에서는 Azure SQL Managed Instance와 관련된 메모리 내 OLTP 및 columnstore 인덱스의 측면을 설명하며, 다음과 같은 샘플도 제공합니다.

  • 여기서는 데이터 크기 제한과 스토리지에 대한 이와 같은 기술의 영향에 대해 알아봅니다.
  • 다양한 가격 책정 계층 사이에서 이러한 기술을 사용하는 데이터베이스의 이동을 관리하는 방법을 알아보세요.
  • 또한 columnstore 인덱스뿐만 아니라 메모리 내 OLTP의 사용을 보여 주는 두 개의 샘플이 표시됩니다.

SQL Server에서 메모리 내 OLTP에 대한 자세한 내용은 다음을 참조하세요.

메모리 내 OLTP

메모리 내 OLTP 기술은 메모리에 모든 데이터를 유지하여 매우 빠른 데이터 액세스 작업을 제공합니다. 또한 특수한 인덱스, 쿼리의 네이티브 컴파일 및 래치 없는 데이터 액세스를 사용하여 OLTP 워크로드의 성능을 개선합니다. 메모리 내 OLTP 데이터를 구성하는 방법에는 두 가지가 있습니다.

  • 모든 행이 별도의 메모리 개체인 메모리 최적화 rowstore 형식. 고성능 OLTP 워크로드에 최적화된 클래식 메모리 내 OLTP 형식입니다. 메모리 최적화 rowstore 형식으로 사용할 수 있는 두 가지 유형의 메모리 최적화 테이블이 있습니다.

    • 서버를 다시 시작한 후 메모리에 행이 배치되는 지속성 테이블(SCHEMA_AND_DATA). 이 유형의 테이블은 기존 rowstore 테이블처럼 동작하면서 메모리 내 최적화의 추가적인 혜택을 제공합니다.
    • 비지속형 테이블(SCEMA_ONLY). 여기서 행은 다시 시작된 후 유지되지 않습니다. 이 유형의 테이블은 임시 데이터(예: 임시 테이블 교체) 또는 데이터를 일부 지속형 테이블(준비 테이블이라고 함)로 이동하기 전에 신속하게 로드해야 하는 테이블을 위해 설계되었습니다.
  • 데이터가 열 형식으로 구성된 메모리 최적화 columnstore 형식. 이 구조는 OLTP 워크로드가 실행되는 동일한 데이터 구조에서 분석 쿼리를 실행해야 하는 HTAP 시나리오를 위해 설계되었습니다.

참고 항목

메모리 내 OLTP 기술은 완전히 메모리에 상주할 수 있는 데이터 구조를 위해 설계되었습니다. 메모리 내 데이터를 디스크로 오프로드할 수 없으므로 메모리가 충분한 SQL Managed Instance를 사용하고 있는지 확인합니다. 자세한 내용은 메모리 내 OLTP의 데이터 크기 및 스토리지 최대값을 참조하세요.

메모리 내 OLTP의 데이터 크기 및 스토리지 최대값

메모리 내 OLTP는 사용자 데이터를 저장하는 데 사용되는 메모리 최적화 테이블을 포함합니다. 이러한 테이블은 메모리에 맞게 지정해야 합니다. 이 아이디어를 메모리 내 OLTP 스토리지라고 합니다.

중요 비즈니스용 서비스 계층에는 vCore 수에 따라 결정되는 특정 양의 최대 메모리 내 OLTP 메모리가 포함됩니다.

메모리 내 OLTP 스토리지 제한 계산 시 포함되는 항목은 다음과 같습니다.

  • 메모리 최적화 테이블 및 테이블 변수의 활성 사용자 데이터 행. 이전 행 버전은 최대값 계산에 포함되지 않습니다.
  • 메모리 최적화 테이블에 대한 인덱스입니다.
  • ALTER TABLE 작업의 운영 오버헤드.

제한에 도달한 경우 할당량 초과 오류가 표시되고 더 이상 데이터를 삽입하거나 업데이트할 수 없습니다. 이 오류를 완화하려면 데이터를 삭제하거나 데이터베이스 또는 풀의 가격 책정 계층을 늘립니다.

제한에 도달한 경우 메모리 내 OLTP 스토리지 사용률을 모니터링하고 경고를 구성하는 방법에 대한 자세한 내용은 메모리 내 스토리지 모니터링을 참조하세요.

하드웨어 구성 또는 vCore 수 변경

하드웨어 구성 또는 vCore 수를 다운그레이드하면 SQL Managed Instance에 부정적인 영향을 줄 수 있습니다.

메모리 최적화 테이블의 데이터는 하드웨어 구성 및 vCore 수에 대한 메모리 내 OLTP 스토리지 한도 내에 있어야 합니다. 가용 메모리 내 OLTP 스토리지가 부족한 수준의 설정으로 스케일 다운하려고 하면 작업이 실패합니다.

메모리 내 개체가 있는지 확인

SQL Managed Instance의 지정된 데이터베이스가 메모리 내 OLTP를 지원하는지를 파악하는 프로그래밍 방식도 있습니다. 다음 Transact-SQL 쿼리를 실행할 수 있습니다.

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

쿼리에서 1을 반환하면 메모리 내 OLTP가 이 데이터베이스에서 지원되는 것입니다.

다음 쿼리는 메모리 내 기술을 사용하여 모든 개체를 식별합니다.

SELECT * FROM sys.tables WHERE is_memory_optimized=1
SELECT * FROM sys.table_types WHERE is_memory_optimized=1
SELECT * FROM sys.sql_modules WHERE uses_native_compilation=1

메모리 내 columnstore

메모리 내 columnstore 기술을 사용하면 테이블에 대량의 데이터를 저장하고 쿼리할 수 있습니다. Columnstore 기술은 열 기반 데이터 스토리지 형식 및 일괄 쿼리 처리를 사용하여 기존 행 기반 스토리지보다 OLAP에서 최대 10배 높은 쿼리 성능을 실현합니다. 또한 압축되지 않은 데이터 크기보다 최대 10배의 데이터 압축 향상을 얻을 수 있습니다.

데이터를 구성하는 데 사용할 수 있는 두 가지 유형의 columnstore 모델이 있습니다.

  • 클러스터형 columnstore 여기서 테이블의 모든 데이터는 열 형식으로 구성됩니다. 이 모델에서 테이블의 모든 행은 데이터를 많이 압축하고 테이블에서 빠른 분석 쿼리 및 보고서를 실행할 수 있도록 열 형식으로 배치됩니다. 데이터의 특성에 따라 데이터 크기가 10~100배 감소할 수 있습니다. 또한 클러스터형 columnstore 모델을 사용하면 100,000개보다 큰 데이터 일괄 처리가 디스크에 저장되기 전에 압축되므로 대량 데이터(대량 로드)를 빠르게 수집할 수 있습니다. 이 모델은 클래식 데이터 웨어하우스 시나리오에 적합합니다.
  • 데이터가 기존 rowstore 테이블에 저장되고 분석 쿼리에 사용되는 columnstore 형식의 인덱스가 있는 비클러스터형 columnstore. 이 모델은 HTAP(하이브리드 트랜잭션 분석 처리)를 사용하도록 설정합니다. 이 기능은 트랜잭션 워크로드에서 성능이 뛰어난 실시간 분석을 실행합니다. OLTP 쿼리는 작은 행의 세트에 액세스하는 데 최적화된 rowstore 테이블에서 실행되는 반면 OLAP 쿼리는 스캔 및 분석에 유용한 columnstore 인덱스에서 실행됩니다. 쿼리 최적화는 쿼리에 따라 rowstore 또는 columnstore 형식을 동적으로 선택합니다. 비클러스터형 columnstore 인덱스는 원래 데이터 집합이 변경되지 않고 원래 rowstore 테이블에 유지되므로 데이터 크기를 줄이지 않습니다. 그러나 추가 columnstore 인덱스의 크기는 해당 B-트리 인덱스보다 작은 크기의 순서에 있어야 합니다.

참고 항목

메모리 내 columnstore 기술은 메모리에서 처리하는 데 필요한 데이터만 유지하고 메모리에 맞지 않는 데이터는 디스크에 저장합니다. 따라서 메모리 내 columnstore 구조에서 데이터의 양은 사용할 수 있는 메모리 양을 초과할 수 있습니다.

columnstore 인덱스의 데이터 크기 및 스토리지

Columnstore 인덱스는 메모리에 맞지 않아도 됩니다. 따라서 인덱스 크기에 대한 유일한 최대값은 전체 데이터베이스 최대 크기입니다. 자세한 내용은 Azure SQL Managed Instance 리소스 한도를 참조하세요. Azure SQL Managed Instance는 모든 계층에서 columnstore 인덱스를 지원합니다.

클러스터형 columnstore 인덱스를 사용하는 경우 기본 테이블 스토리지에 열 형식 압축이 사용됩니다. 이 압축을 통해 사용자 데이터의 스토리지 공간을 크게 줄일 수 있습니다. 즉, 데이터베이스에 더 많은 데이터를 담을 수 있습니다. 또한 압축은 열 형식 보관 압축을 사용하여 늘릴 수 있습니다. 수행할 수 있는 압축의 크기는 데이터의 특성에 따라 달라지지만 보통 10배 정도 압축됩니다.

예를 들어, 최대 크기 1TB(테라바이트)인 데이터베이스가 있고 columnstore 인덱스를 사용하여 10배 압축을 달성한 경우 데이터베이스에 총 10TB의 사용자 데이터를 담을 수 있습니다.

비클러스터형 columnstore 인덱스를 사용하는 경우 기본 테이블은 여전히 기존의 rowstore 형식으로 저장됩니다. 따라서 스토리지 절감이 클러스터형 columnstore 인덱스만큼 크지 않습니다. 그러나 기존의 많은 비클러스터형 인덱스를 단일 columnstore 인덱스로 바꾸는 경우에도 테이블에 대한 스토리지 공간에서 전반적인 절감 효과를 얻을 수 있습니다.