다음을 통해 공유


메모리 액세스에 최적화된 테이블에 대한 통계

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

쿼리 최적화 프로그램에서는 열에 대한 통계를 사용하여 쿼리 성능을 향상시키는 쿼리 계획을 만듭니다. 통계는 데이터베이스의 테이블에서 수집되고 데이터베이스 메타데이터에 저장됩니다.

통계는 자동으로 생성되지만 수동으로 만들 수도 있습니다. 예를 들어 인덱스를 만들 때 인덱스 키 열에 대한 통계가 자동으로 생성됩니다. 통계 생성에 대한 자세한 내용은 통계를 참조하세요.

일반적으로 테이블 데이터는 시간이 지남에 따라 행이 삽입, 업데이트, 삭제될 때 변경됩니다. 즉, 통계를 주기적으로 업데이트해야 합니다. 기본적으로 테이블의 통계는 쿼리 최적화 프로그램에서 만료될 수 있다고 판단할 때 자동으로 업데이트됩니다.

메모리 최적화 테이블의 통계에 대한 고려 사항은 다음과 같습니다.

  • SQL Server 2016 및 Azure SQL 데이터베이스부터 130개 이상의 데이터베이스 호환성 수준을 사용하는 경우 메모리 최적화 테이블에 대한 통계 자동 업데이트가 지원됩니다. ALTER DATABASE 호환성 수준(Transact-SQL)을 참조하세요. 이전에 낮은 호환성 수준을 사용하여 만든 테이블이 데이터베이스에 있는 경우 통계를 수동으로 한 번 업데이트해야 이후에 통계의 자동 업데이트가 적용됩니다.

  • 네이티브 컴파일된 저장 프로시저의 경우 생성 시 프로시저를 컴파일할 때 프로시저의 쿼리에 대한 실행 계획이 최적화됩니다. 통계가 업데이트될 때 자동으로 다시 컴파일되지 않습니다. 따라서 프로시저가 생성되기 전에 테이블에는 대표적인 데이터 집합이 포함되어야 합니다.

  • 고유하게 컴파일된 저장 프로시저는 sp_recompile(TRANSACT-SQL)을 사용하여 수동으로 다시 컴파일할 수 있으며, 데이터베이스가 오프라인으로 전환되었다가 다시 온라인으로 전환된 경우 또는 데이터베이스가 장애 조치(failover)되거나 서버가 다시 시작된 경우 자동으로 다시 컴파일됩니다.

기존 테이블에서 통계 자동 업데이트 사용

호환성 수준이 130 이상인 데이터베이스에서 테이블을 만들면 해당 테이블의 모든 통계에 대해 통계 자동 업데이트가 사용하도록 설정되며 추가 작업이 필요하지 않습니다.

데이터베이스에 SQL Server의 이전 버전 또는 130보다 낮은 호환성 수준에서 만든 메모리 최적화 테이블이 있는 경우에는 통계를 수동으로 한 번 업데이트해야 이후에 자동 업데이트가 적용됩니다.

이전 호환성 수준에서 만든 메모리 최적화 테이블에 대한 통계 자동 업데이트를 사용하도록 설정하려면 다음 단계를 수행합니다.

  1. 데이터베이스 호환성 수준을 업데이트합니다. ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130

  2. 메모리 최적화 테이블의 통계를 수동으로 업데이트합니다. 다음은 동일한 작업을 수행하는 샘플 스크립트입니다.

  3. 업데이트된 통계를 활용하기 위해 고유하게 컴파일된 저장 프로시저를 수동으로 다시 컴파일합니다.

통계에 대한 일회성 스크립트: 낮은 호환성 수준에서 만든 메모리 최적화 테이블에 대해 다음 TRANSACT-SQL 스크립트를 한 번 실행하여 모든 메모리 최적화 테이블의 통계를 업데이트하고 향후 통계 자동 업데이트를 사용하도록 설정합니다(데이터베이스에서 AUTO_UPDATE_STATISTICS가 사용하도록 설정된 것으로 가정).

-- Assuming AUTO_UPDATE_STATISTICS is already ON for your database:
-- ALTER DATABASE CURRENT SET AUTO_UPDATE_STATISTICS ON;

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130;
GO
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT
      @sql += N'UPDATE STATISTICS '
         + quotename(schema_name(t.schema_id))
         + N'.'
         + quotename(t.name)
         + ';' + CHAR(13) + CHAR(10)
   FROM sys.tables AS t
   WHERE t.is_memory_optimized = 1 AND 
		t.object_id IN (SELECT object_id FROM sys.stats WHERE no_recompute=1)
;
EXECUTE sp_executesql @sql;
GO
-- Each row appended to @sql looks roughly like:
-- UPDATE STATISTICS [dbo].[MyMemoryOptimizedTable];

자동 업데이트 사용 설정 확인: 다음 스크립트는 메모리 최적화 테이블에 대한 통계에 자동 업데이트가 사용되는지 여부를 확인합니다. 이전 스크립트를 실행한 후에는 모든 통계 개체에 대한 auto-update enabled열에서 1이 반환됩니다.

SELECT 
	quotename(schema_name(o.schema_id)) + N'.' + quotename(o.name) AS [table],
	s.name AS [statistics object],
	1-s.no_recompute AS [auto-update enabled]
FROM sys.stats s JOIN sys.tables o ON s.object_id=o.object_id
WHERE o.is_memory_optimized=1

테이블 및 절차 배포 지침

쿼리 계획을 만들 때 쿼리 최적화 프로그램에 최신 통계가 사용되도록 다음 4단계를 사용하여 메모리 최적화 테이블 및 고유하게 컴파일된 저장 프로시저를 배포합니다.

  1. 데이터베이스의 호환성 수준이 130 이상인지 확인합니다. ALTER DATABASE 호환성 수준(Transact-SQL)을 참조하세요.

  2. 테이블과 인덱스를 만듭니다. 인덱스는 CREATE TABLE 문에서 인라인으로 지정해야 합니다.

  3. 테이블에 데이터를 로드합니다.

  4. 테이블에 액세스하는 저장 프로시저를 만듭니다.

데이터를 로드한 후 네이티브 컴파일된 저장 프로시저를 만들면 최적화 프로그램에서 메모리 최적화 테이블에 사용할 수 있는 통계가 있는지 확인할 수 있습니다. 이렇게 하면 프로시저가 컴파일될 때 효율적인 쿼리 계획이 보장됩니다.

참고 항목

메모리 최적화 테이블