azure-sql-optimization について
Azure SQL Database の管理者や開発者向けの最適化リファレンススキルです。性能監視、自動チューニング、接続設定、コスト管理に加え、Azure 固有の制約と対処法を扱います。
主な機能
- 01サービス階層、DTU、vCore の比較
- 02リソースとクエリの監視例
- 03自動チューニングと推奨事項の適用
- 04Hyperscale とサーバーレスの設定
- 05接続プーリング、再試行、コスト最適化
活用シーン
- 01ワークロードに合うサービス階層の選定
- 02CPU や I/O 負荷の高いクエリの調査
- 03自動一時停止と読み取りスケールアウトの設定
- 04容量の評価とデータベースコストの削減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill azure-sql-optimizationインストール後、Claude Code で/azure-sql-optimizationを入力して読み込まれたか確認します。
詳細
Azure SQL Database の最適化
Azure SQL Database 向けのプラットフォーム固有の最適化です。
クイックリファレンス
サービス階層の比較
| 階層 | 最適な用途 | 最大サイズ | 主な機能 |
|---|---|---|---|
| Basic | 開発/テスト、軽いワークロード | 2 GB | 低コスト |
| Standard | 一般的なワークロード | 1 TB | S0-S12 DTU |
| Premium | 高 I/O、低レイテンシ | 4 TB | P1-P15 DTU |
| General Purpose (vCore) | ほとんどのワークロード | 16 TB | サーバーレスオプション |
| Business Critical | 高可用性 | 4 TB | インメモリ、読み取りレプリカ |
| Hyperscale | 大規模データベース | 100 TB | ストレージの自動スケーリング |
DTU と vCore の比較
| 項目 | DTU | vCore |
|---|---|---|
| 料金 | リソースをまとめて提供 | コンピューティングとストレージを個別に提供 |
| 制御 | 限定的 | 細かく制御可能 |
| 予約容量 | なし | あり(最大 72% の節約) |
| サーバーレス | なし | あり(General Purpose) |
| 最適な用途 | シンプルなワークロード | 予測可能なワークロード、移行済みのワークロード |
パフォーマンスの監視
リソース消費量
-- Last 15 minutes (avg 15-second intervals)
SELECT
end_time,
avg_cpu_percent,
avg_data_io_percent,
avg_log_write_percent,
avg_memory_usage_percent,
max_worker_percent,
max_session_percent
FROM sys.dm_db_resource_stats
ORDER BY end_time DESC;
-- Historical (last 14 days, hourly)
SELECT
start_time,
end_time,
avg_cpu_percent,
avg_data_io_percent,
avg_log_write_percent
FROM sys.resource_stats
WHERE database_name = DB_NAME()
ORDER BY start_time DESC;
クエリ パフォーマンスの分析情報
-- Top CPU consumers last hour
SELECT TOP 20
qt.query_sql_text,
rs.avg_cpu_time / 1000 AS avg_cpu_ms,
rs.count_executions,
rs.avg_cpu_time * rs.count_executions / 1000 AS total_cpu_ms
FROM sys.query_store_query q
JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id
JOIN sys.query_store_plan p ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats rs ON p.plan_id = rs.plan_id
JOIN sys.query_store_runtime_stats_interval rsi ON rs.runtime_stats_interval_id = rsi.runtime_stats_interval_id
WHERE rsi.start_time >= DATEADD(hour, -1, GETUTCDATE())
ORDER BY rs.avg_cpu_time * rs.count_executions DESC;
自動チューニング
自動チューニングを有効にする
-- Enable all auto-tuning options
ALTER DATABASE current
SET AUTOMATIC_TUNING (
FORCE_LAST_GOOD_PLAN = ON,
CREATE_INDEX = ON,
DROP_INDEX = ON
);
-- Check current settings
SELECT * FROM sys.database_automatic_tuning_options;
チューニングの推奨事項を表示する
-- Current recommendations
SELECT
name,
reason,
score,
state_desc,
is_revertable_action,
is_executable_action,
details
FROM sys.dm_db_tuning_recommendations;
推奨事項を適用する
-- Force a specific query plan
EXEC sp_query_store_force_plan @query_id = 12345, @plan_id = 67890;
-- Unforce plan
EXEC sp_query_store_unforce_plan @query_id = 12345, @plan_id = 67890;
Hyperscale の機能
ストレージの自動スケーリング
- 最大 128 TB まで自動的に拡張します
- ストレージを事前にプロビジョニングする必要はありません
- 使用したストレージ分のみ料金が発生します
読み取りスケールアウト
-- Connection string option
ApplicationIntent=ReadOnly
-- In application code
"Server=myserver.database.windows.net;Database=mydb;ApplicationIntent=ReadOnly;..."
名前付きレプリカ
-- Create named replica
ALTER DATABASE MyDatabase
ADD SECONDARY ON SERVER MySecondaryServer
WITH (SERVICE_OBJECTIVE = 'HS_Gen5_2', SECONDARY_TYPE = Named, NAME = N'MyReadReplica');
サーバーレス構成
自動一時停止を構成する
-- Via Azure Portal, CLI, or PowerShell
-- Set auto-pause delay (minutes), min/max vCores
-- Check current usage
SELECT
cpu_percent,
auto_pause_delay_in_minutes_configured
FROM sys.dm_db_resource_stats_serverless;
サーバーレスのベストプラクティス
- 断続的なワークロードに使用する - アイドル期間中のコストを節約できます
- 適切な最小 vCore 数を設定する - 時間制約のあるアプリのコールドスタートを防ぎます
- 自動一時停止を監視する - 自動再開によりレイテンシが発生します
- 一貫したワークロードでは常時稼働を検討する - プロビジョニング済みの方が安価な場合があります
接続の最適化
接続プーリング
// .NET connection string
"Server=tcp:myserver.database.windows.net,1433;Database=mydb;
Min Pool Size=10;Max Pool Size=100;Connection Timeout=30;"
再試行ロジック
// Azure SQL requires retry logic for transient faults
var options = new SqlRetryLogicOption()
{
NumberOfTries = 5,
DeltaTime = TimeSpan.FromSeconds(1),
MaxTimeInterval = TimeSpan.FromSeconds(30)
};
接続のベストプラクティス
- 接続プーリングを使用する - 接続のオーバーヘッドを削減します
- 再試行ロジックを実装する - 一時的な障害(エラー 40613、40197)に対処します
- リダイレクト接続モードを使用する - 初回接続後のパフォーマンスが向上します
- 接続を速やかに閉じる - 接続を不必要に保持しないでください
Azure 固有の制限
サポート対象外
- SQL Agent(Azure Functions、Logic Apps を使用してください)
- ファイルからの BULK INSERT(Blob Storage を使用してください)
- リンク サーバー(Elastic Query を使用してください)
- FILESTREAM
- 同じサーバー内のデータベース間クエリ(Elastic Query を使用してください)
回避策
Blob Storage からの一括挿入
-- Create credential
CREATE DATABASE SCOPED CREDENTIAL BlobCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'your_sas_token';
-- Create external data source
CREATE EXTERNAL DATA SOURCE BlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://youraccount.blob.core.windows.net/container',
CREDENTIAL = BlobCredential
);
-- Bulk insert
BULK INSERT MyTable
FROM 'data.csv'
WITH (DATA_SOURCE = 'BlobStorage', FORMAT = 'CSV', FIRSTROW = 2);
データベース間クエリに Elastic Query を使用する
-- On target database
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE DATABASE SCOPED CREDENTIAL ElasticCredential
WITH IDENTITY = 'username', SECRET = 'password';
CREATE EXTERNAL DATA SOURCE RemoteDB
WITH (
TYPE = RDBMS,
LOCATION = 'remote-server.database.windows.net',
DATABASE_NAME = 'RemoteDatabase',
CREDENTIAL = ElasticCredential
);
CREATE EXTERNAL TABLE dbo.RemoteTable (...)
WITH (DATA_SOURCE = RemoteDB);
コストの最適化
予約容量
- 従量課金と比べて最大 72% 節約できます
- 1 年または 3 年の期間
- 交換/返金の柔軟性
適正なサイズ設定
-- Check if over-provisioned
SELECT
AVG(avg_cpu_percent) AS avg_cpu,
MAX(avg_cpu_percent) AS max_cpu,
AVG(avg_data_io_percent) AS avg_io,
MAX(avg_data_io_percent) AS max_io
FROM sys.dm_db_resource_stats
WHERE end_time >= DATEADD(day, -7, GETUTCDATE());
-- If avg < 40% consistently, consider downsizing
Hyperscale のコストに関する考慮事項
- コンピューティング:秒単位の課金
- ストレージ:使用済み領域に対する時間単位の課金
- 読み取りレプリカ:追加のコンピューティングコスト
- メモリは自動的に解放されません(適切に監視し、スケーリングしてください)
コメント
Markdown 対応