適用対象:SQL Server on Linux
SQL Server を初めて使用する Linux ユーザーの場合は、次のタスクを使い、パフォーマンス機能の一部について順を追って説明します。 これらは Linux 独自または固有のものではありませんが、さらに調べる領域について考えるヒントになります。 各例には、その分野の詳細なドキュメントへのリンクが提供されています。
注
次の例では、AdventureWorks2022 サンプル データベースを使用します。 このサンプル データベースを入手してインストールする手順については、「バックアップと復元を利用して、SQL Server データベースを Windows から Linux に移行する」を参照してください。
列ストア インデックスを作成する
カラムストアインデックスは、カラムストアと呼ばれるカラム形式で大量のデータを保存・クエリするための技術です。
以下の Transact-SQL(T-SQL)コマンドを実行して、
SalesOrderDetailテーブルにカラムストアインデックスを追加します:CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore] ON Sales.SalesOrderDetail(UnitPrice, OrderQty, ProductID); GO列ストア インデックスを使用してテーブルをスキャンする次のクエリを実行します。
SELECT ProductID, SUM(UnitPrice) AS SumUnitPrice, AVG(UnitPrice) AS AvgUnitPrice, SUM(OrderQty) AS SumOrderQty, AVG(OrderQty) AS 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 は、アプリケーション システムのパフォーマンスを大幅に向上させる In-Memory OLTP 機能を提供します。 このセクションでは、メモリに保存されるメモリ最適化テーブルと、テーブルにアクセスできるネイティブコンパイルされたストアドプロシージャを作成する手順を案内します。
OLTP In-Memory データベースの設定
インメモリ 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 AS INT = 0; WHILE @i < @InsertCount BEGIN INSERT INTO dbo.ShoppingCart VALUES (1, SYSDATETIME(), NULL); SET @i += 1; END END;1,000,000 行を挿入します。
EXECUTE 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
INNER JOIN sys.query_store_query AS Qry
ON Pl.query_id = Qry.query_id
INNER JOIN sys.query_store_query_text AS Txt
ON Qry.query_text_id = Txt.query_text_id;
クエリ動的管理ビュー
動的管理ビューや機能は サーバーの状態情報を返し、サーバーインスタンスの健康状態を監視したり、問題を診断したり、パフォーマンスを調整したりすることができます。
sys.dm_os_wait_stats動的管理ビューをクエリするには:
SELECT wait_type,
wait_time_ms
FROM sys.dm_os_wait_stats;
関連するコンテンツ
- インメモリ OLTP での初期領域の調査
- SQL Server でのインメモリ OLTP 機能の採用計画
- メモリ最適化を使用した一時テーブルとテーブル変数の高速化
- インメモリ OLTP を使用した場合のメモリ使用量の監視とトラブルシューティング
- インメモリ OLTP の概要と使用シナリオ
- パフォーマンスの監視およびチューニング ツール
- パフォーマンスのベスト プラクティス: SQL Server on Linuxのストレージ、カーネル、CPU、ネットワーク
- パフォーマンスのベスト プラクティス: Linux 上の SQL Server のメモリ
- クイック スタート: RED Hat Enterprise Linux に SQL Server をインストールしてデータベースを作成する