Linux의 SQL Server의 성능 기능에 대 한 연습Walkthrough for the performance features of SQL Server on Linux

이 항목 적용 대상: 예SQL Server (Linux 전용)없음Azure SQL Database없음Azure SQL Data Warehouse없음 병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (Linux only)noAzure SQL DatabasenoAzure SQL Data WarehousenoParallel Data Warehouse

SQL Server의 새로운 Linux 사용자 인 경우 다음 작업을 성능 기능 중 몇 가지를 설명 합니다.If you are a Linux user who is new to SQL Server, the following tasks walk you through some of the performance features. 이러한 고유한 또는 Linux를 특정 아니지만 추가 조사를 위해 영역의 아이디어를 제공 하는 데 도움이 됩니다.These are not unique or specific to Linux, but it helps to give you an idea of areas to investigate further. 각 예제 링크는 해당 영역에 대 한 설명서에 제공 됩니다.In each example, a link is provided to the depth documentation for that area.

참고

다음 예제에서는 AdventureWorks 샘플 데이터베이스를 사용합니다.The following examples use the AdventureWorks sample database. 이 샘플 데이터베이스를 설치 하는 방법에 대 한 자세한 내용은 참조 하세요. Windows에서 Linux에 SQL Server 데이터베이스를 복원합니다.For instructions on how to obtain and install this sample database, see Restore a SQL Server database from Windows to Linux.

Columnstore 인덱스 만들기Create a Columnstore Index

Columnstore 인덱스는 columnstore 라는 칼럼 형식 데이터 형식으로 데이터의 큰 저장소를 쿼리 및 저장 하는 기술입니다.A columnstore index is a technology for storing and querying large stores of data in a columnar data format, called a columnstore.

  1. 다음 TRANSACT-SQL 명령을 실행 하 여 SalesOrderDetail 테이블에 Columnstore 인덱스를 추가 합니다.Add a Columnstore index to the SalesOrderDetail table by executing the following Transact-SQL commands:

    CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore]
       ON Sales.SalesOrderDetail
       (UnitPrice, OrderQty, ProductID)
    GO
    
  2. Columnstore 인덱스를 사용 하 여 테이블을 검색 하는 다음 쿼리를 실행 합니다.Execute the following query that uses the Columnstore Index to scan the table:

    SELECT ProductID, SUM(UnitPrice) SumUnitPrice, AVG(UnitPrice) AvgUnitPrice,
       SUM(OrderQty) SumOrderQty, AVG(OrderQty) AvgOrderQty
    FROM Sales.SalesOrderDetail
       GROUP BY ProductID
       ORDER BY ProductID
    
  3. Columnstore 인덱스에 대 한 object_id를 조회 하 고 SalesOrderDetail 테이블에 대 한 사용량 통계에 표시 되는지 확인 하 여 Columnstore 인덱스를 사용 했는지 확인 합니다.Verify that the Columnstore Index was used by looking up the object_id for the Columnstore index and confirming that it appears in the usage stats for the SalesOrderDetail table:

    SELECT * FROM sys.indexes WHERE name = 'IX_SalesOrderDetail_ColumnStore'
    GO
    
    SELECT * 
    FROM sys.dm_db_index_usage_stats
       WHERE database_id = DB_ID('AdventureWorks')
       AND object_id = OBJECT_ID('AdventureWorks.Sales.SalesOrderDetail');
    

메모리 내 OLTP를 사용 합니다.Use In-Memory OLTP

SQL Server 응용 프로그램 시스템의 성능을 크게 향상 시킬 수 있는 메모리 내 OLTP 기능을 제공 합니다.SQL Server provides In-Memory OLTP features that can greatly improve the performance of application systems. 평가 가이드의이 섹션은 메모리 및 컴파일 또는 해석 없이 테이블에 액세스할 수 있는 고유 하 게 컴파일된 저장된 프로시저에 저장 된 메모리 최적화 테이블을 만드는 단계를 안내 합니다.This section of the Evaluation Guide will walk you through the steps to create a memory-optimized table stored in memory and a natively compiled stored procedure that can access the table without needing to be compiled or interpreted.

메모리 내 OLTP에 대 한 데이터베이스 구성Configure Database for In-Memory OLTP

  1. 데이터베이스 호환성 수준을 적어도 130 이상으로 메모리 내 OLTP를 사용 하도록 설정 하이 좋습니다.It’s recommended to set the database to a compatibility level of at least 130 to use In-Memory OLTP. 다음 쿼리를 사용 하 여 AdventureWorks의 현재 호환성 수준을 확인 합니다.Use the following query to check the current compatibility level of AdventureWorks:

    USE AdventureWorks
    GO
    SELECT d.compatibility_level
    FROM sys.databases as d
      WHERE d.name = Db_Name();
    GO
    

    필요한 경우 수준을 130으로 업데이트 합니다.If necessary, update the level to 130:

    ALTER DATABASE CURRENT
    SET COMPATIBILITY_LEVEL = 130;
    GO
    
  2. 트랜잭션에 디스크 기반 테이블과 메모리 최적화 테이블에서는의 필수적이 지는 메모리 최적화 트랜잭션 부분은 트랜잭션 격리 수준에서 작동 하는 명명 된 스냅숏.When a transaction involves both a disk-based table and a memory-optimized table, it’s essential that the memory-optimized portion of the transaction operate at the transaction isolation level named SNAPSHOT. 크로스 컨테이너 트랜잭션에서 메모리 최적화 테이블에 대 한이 수준에 안정적으로 강제 적용 하려면 다음을 실행 합니다.To reliably enforce this level for memory-optimized tables in a cross-container transaction, execute the following:

    ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON
    GO
    
  3. 만들기 전에 먼저 메모리 최적화 테이블을 메모리 최적화 파일 그룹 및 데이터 파일에 대 한 컨테이너를 만듭니다.Before you can create a memory-optimized table you must first create a Memory Optimized FILEGROUP and a container for data files:

    ALTER DATABASE AdventureWorks ADD FILEGROUP AdventureWorks_mod CONTAINS memory_optimized_data
    GO  
    ALTER DATABASE AdventureWorks ADD FILE (NAME='AdventureWorks_mod', FILENAME='/var/opt/mssql/data/AdventureWorks_mod') TO FILEGROUP AdventureWorks_mod
    GO
    

메모리 액세스에 최적화 된 테이블 만들기Create a Memory-Optimized Table

메모리 최적화 테이블에 대 한 기본 저장소 인 주 메모리 등 디스크 기반 테이블과 달리 데이터 하지 않아도에서 메모리 버퍼를 디스크에서 읽을 수 있습니다.The primary store for memory-optimized tables is main memory and so unlike disk-based tables, data does not need to be read in from disk into memory buffers. 메모리 최적화 테이블을 만들려면 사용 하 여는 MEMORY_OPTIMIZED = ON 절.To create a memory-optimized table, use the MEMORY_OPTIMIZED = ON clause.

  1. 메모리 최적화 테이블 dbo를 만들려면 다음 쿼리를 실행 합니다. ShoppingCart 합니다.Execute the following query to create the memory-optimized table dbo.ShoppingCart. 기본적으로 데이터는 내구성 목적 (스키마를 유지 하려면 내구성도 설정할 수 있는 참고) 디스크에 유지 됩니다.As a default, the data will be persisted on disk for durability purposes (Note that DURABILITY can also be set to persist the schema only).

    CREATE TABLE dbo.ShoppingCart ( 
    ShoppingCartId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED,
    UserId INT NOT NULL INDEX ix_UserId NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000), 
    CreatedDate DATETIME2 NOT NULL, 
    TotalPrice MONEY
    ) WITH (MEMORY_OPTIMIZED=ON) 
    GO
    
  2. 테이블에 몇 가지 레코드를 삽입 합니다.Insert some records into the table:

    INSERT dbo.ShoppingCart VALUES (8798, SYSDATETIME(), NULL) 
    INSERT dbo.ShoppingCart VALUES (23, SYSDATETIME(), 45.4) 
    INSERT dbo.ShoppingCart VALUES (80, SYSDATETIME(), NULL) 
    INSERT dbo.ShoppingCart VALUES (342, SYSDATETIME(), 65.4) 
    

고유 하 게 컴파일된 저장 프로시저Natively compiled Stored Procedure

SQL Server 메모리 액세스에 최적화 된 테이블에 액세스 하는 고유 하 게 컴파일된 저장된 프로시저를 지원 합니다.SQL Server supports natively compiled stored procedures that access memory-optimized tables. T-SQL 문이 기계어 코드로 컴파일되고 빠른 데이터 액세스와 일반 T-SQL 보다 더 효율적인 쿼리 실행을 사용 하도록 설정 하는 네이티브 Dll로 저장 됩니다.The T-SQL statements are compiled to machine code and stored as native DLLs, enabling faster data access and more efficient query execution than traditional T-SQL. NATIVE_COMPILATION으로 표시된 저장 프로시저는 고유하게 컴파일됩니다.Stored procedures that are marked with NATIVE_COMPILATION are natively compiled.

  1. ShoppingCart 테이블로 많은 수의 레코드를 삽입 하는 고유 하 게 컴파일된 저장된 프로시저를 만들려면 다음 스크립트를 실행 합니다.Execute the following script to create a natively compiled stored procedure that inserts a large number of records into the ShoppingCart table:
CREATE PROCEDURE dbo.usp_InsertSampleCarts @InsertCount int 
 WITH NATIVE_COMPILATION, SCHEMABINDING AS 
BEGIN ATOMIC 
WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')

DECLARE @i int = 0

WHILE @i < @InsertCount 
 BEGIN 
  INSERT INTO dbo.ShoppingCart VALUES (1, SYSDATETIME() , NULL) 
  SET @i += 1 
 END
END 
  1. 1,000,000 개의 행을 삽입 합니다.Insert 1,000,000 rows:

    EXEC usp_InsertSampleCarts 1000000 
    
  2. 행이 삽입 되었는지 확인 합니다.Verify the rows have been inserted:

    SELECT COUNT(*) FROM dbo.ShoppingCart 
    

메모리 내 OLTP에 자세히 알아보기Learn More About In-Memory OLTP

메모리 내 OLTP에 대 한 자세한 내용은 다음 항목을 참조 하세요.For more information about In-Memory OLTP, see the following topics:

쿼리 저장소 사용Use Query Store

쿼리 저장소는 쿼리, 실행 계획 및 런타임 통계에 대 한 자세한 성능 정보를 수집합니다.Query Store collects detailed performance information about queries, execution plans, and runtime statistics.

쿼리 저장소는 기본적으로 활성화 되지 및 ALTER DATABASE를 사용 하 여 사용할 수 있습니다.Query Store is not active by default and can be enabled with ALTER DATABASE:

ALTER DATABASE AdventureWorks SET QUERY_STORE = ON;

쿼리 저장소에서 쿼리 및 계획에 대 한 정보를 반환 하려면 다음 쿼리를 실행 합니다.Run the following query to return information about queries and plans in the query store:

SELECT Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*
FROM sys.query_store_plan AS Pl
   JOIN sys.query_store_query AS Qry
      ON Pl.query_id = Qry.query_id
   JOIN sys.query_store_query_text AS Txt
      ON Qry.query_text_id = Txt.query_text_id ;

쿼리 동적 관리 뷰Query Dynamic Management Views

동적 관리 뷰는 서버 인스턴스의 상태를 모니터링, 문제를 진단 및 성능 튜닝에 사용할 수 있는 서버 상태 정보를 반환 합니다.Dynamic management views return server state information that can be used to monitor the health of a server instance, diagnose problems, and tune performance.

Dm_os_wait 통계 동적 관리 뷰를 쿼리하려면:To query the dm_os_wait stats dynamic management view:

SELECT wait_type, wait_time_ms
FROM sys.dm_os_wait_stats;