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

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. 이 예제 데이터베이스를 설치 하는 방법에 지침은 Linux에 Windows에서 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. T-SQL 아래를 실행 하 여 SalesOrderDetail 테이블에 Columnstore 인덱스를 추가 합니다.Add a Columnstore index to the SalesOrderDetail table by executing the T-SQL below:

    CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore]
       ON Sales.SalesOrderDetail
       (UnitPrice, OrderQty, ProductID)
    GO
    
  2. 테이블 검색에 Columnstore 인덱스를 사용 하는 다음 쿼리를 실행 합니다.Execute the following query that will use 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. 데이터베이스 호환성 수준을 메모리 내 OLTP를 사용 하려면 적어도 130 이상으로 설정 하는 것이 좋습니다.It’s recommended to set the database to a compatibility level of at least 130 to use In-Memory OLTP. 다음 쿼리를 사용 하 여 AdventureWorks의 현재 호환성 수준을 확인 하려면:Use the query below 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. 트랜잭션이 모두 디스크 기반 테이블 및 메모리 액세스에 최적화 된 테이블을 포함 하는 경우의 필수적이 지는 메모리 액세스에 최적화 된 트랜잭션 부분은 트랜잭션 격리 수준에서 작동 하는 SNAPSHOT을 이라고 합니다.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. 1000000 행을 삽입 합니다.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 stats 동적 관리 뷰를 쿼리 합니다 하:To query the dm_os_wait stats dynamic management view:

SELECT wait_type, wait_time_ms
FROM sys.dm_os_wait_stats;