SQL Server on Linux のパフォーマンス機能のチュートリアル
適用対象: SQL Server - Linux
SQL Server を初めて使用する Linux ユーザーの場合は、次のタスクを使い、パフォーマンス機能の一部について順を追って説明します。 これらは Linux 独自または固有のものではありませんが、さらに調べる領域について考えるヒントになります。 各例には、その領域の詳細なドキュメントのリンクが記載されています。
Note
次の例では、AdventureWorks2022
サンプル データベースを使用します。 このサンプル データベースを入手してインストールする手順については、Windows から Linux への SQL Server データベースの復元に関する記事を参照してください。
列ストア インデックスを作成する
列ストア インデックスは、列ストアと呼ばれる列データ形式で大量のデータを格納し、クエリを実行するためのテクノロジです。
次の Transact-SQL コマンドを実行して、
SalesOrderDetail
テーブルに列ストア インデックスを追加します。CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore] ON Sales.SalesOrderDetail (UnitPrice, OrderQty, ProductID); GO
列ストア インデックスを使用してテーブルをスキャンする次のクエリを実行します。
SELECT ProductID, SUM(UnitPrice) SumUnitPrice, AVG(UnitPrice) AvgUnitPrice, SUM(OrderQty) SumOrderQty, AVG(OrderQty) AvgOrderQty FROM Sales.SalesOrderDetail GROUP BY ProductID ORDER BY ProductID;
列ストア インデックスの
object_id
を調べ、それがSalesOrderDetail
テーブルの使用状況の統計情報に存在することを確認して、列ストア インデックスが使用されたことを確認します。SELECT * FROM sys.indexes WHERE name = 'IX_SalesOrderDetail_ColumnStore' GO SELECT * FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID('AdventureWorks2022') AND object_id = OBJECT_ID('AdventureWorks2022.Sales.SalesOrderDetail');
インメモリ OLTP を使用する
SQL Server には、アプリケーション システムのパフォーマンスを大幅に改善できるインメモリ OLTP 機能があります。 このセクションでは、メモリに格納されたメモリ最適化テーブルと、コンパイルや解釈を必要とせずにそのテーブルにアクセスできるネイティブ コンパイルされたストアド プロシージャを作成する手順について説明します。
インメモリ OLTP のデータベースを構成する
インメモリ OLTP を使用するには、データベースを 130 以上の互換性レベルに設定することをお勧めします。
AdventureWorks2022
の現在の互換性レベルを確認するには、次のクエリを使用します。USE AdventureWorks2022; GO SELECT d.compatibility_level FROM sys.databases as d WHERE d.name = DB_NAME(); GO
必要に応じて、レベルを 130 に更新します。
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130; GO
トランザクションがディスクベースのテーブルとメモリ最適化テーブルの両方に関係する場合、トランザクションのメモリ最適化部分が SNAPSHOT というトランザクション分離レベルで動作することが不可欠です。 クロスコンテナー トランザクションのメモリ最適化テーブルにこのレベルを確実に適用するには、以下を実行します。
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON; GO
メモリ最適化テーブルを作成する前に、まずメモリ最適化ファイル グループと、データ ファイル用コンテナーを作成する必要があります。
ALTER DATABASE AdventureWorks2022 ADD FILEGROUP AdventureWorks_mod CONTAINS memory_optimized_data; GO ALTER DATABASE AdventureWorks2022 ADD FILE (NAME='AdventureWorks_mod', FILENAME='/var/opt/mssql/data/AdventureWorks_mod') TO FILEGROUP AdventureWorks_mod; GO
メモリ最適化テーブルを作成する
メモリ最適化テーブルのプライマリ ストアはメイン メモリなので、ディスクベースのテーブルとは異なり、データをディスクからメモリ バッファーに読み込む必要はありません。 メモリ最適化テーブルを作成するには、MEMORY_OPTIMIZED = ON 句を使用します。
次のクエリを実行して、メモリ最適化テーブル dbo.ShoppingCart を作成します。 既定で、データは持続性のためにディスクに永続化されます (DURABILITY はスキーマのみを永続化するように設定することもできます)。
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
テーブルにいくつかのレコードを挿入します。
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);
ネイティブ コンパイル ストアド プロシージャ
SQL Server は、メモリ最適化テーブルにアクセスするネイティブ コンパイル ストアド プロシージャをサポートしています。 T-SQL ステートメントはマシン コードにコンパイルされ、ネイティブ DLL として保存されるので、従来の T-SQL よりも高速なデータ アクセスとより効率的なクエリ実行が可能になります。 NATIVE_COMPILATION が設定されているストアド プロシージャはネイティブでコンパイルされます。
次のスクリプトを実行して、ShoppingCart テーブルに多数のレコードを挿入するネイティブ コンパイル ストアド プロシージャを作成します。
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,000,000 行を挿入します。
EXEC usp_InsertSampleCarts 1000000;
行が挿入されたことを確認します。
SELECT COUNT(*) FROM dbo.ShoppingCart;
クエリ ストアを使用する
クエリ ストアでは、クエリ、実行プラン、およびランタイム統計に関する詳細なパフォーマンス情報を収集します。
SQL Server 2022 (16.x) より前では、クエリ ストアは既定で有効ではなく、ALTER DATABASE を使って有効にできます。
ALTER DATABASE AdventureWorks2022 SET QUERY_STORE = ON;
次のクエリを実行して、クエリ ストア内のクエリとプランに関する情報を返します。
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;
クエリ動的管理ビュー
動的管理ビューでは、サーバーの状態情報が返されます。返された情報は、サーバー インスタンスのヘルス状態の監視、問題の診断、パフォーマンスのチューニングに使用できます。
dm_os_wait stats 動的管理ビューのクエリを実行するには:
SELECT wait_type, wait_time_ms
FROM sys.dm_os_wait_stats;
関連項目
- クイック スタート 1:Transact-SQL のパフォーマンスを向上させるインメモリ OLTP テクノロジ
- インメモリ OLTP への移行
- メモリ最適化を使用した一時テーブルとテーブル変数の高速化
- メモリ使用量の監視とトラブルシューティング
- インメモリ OLTP (インメモリ最適化)