mcpField
A
azure-sql-optimization

azure-sql-optimization

github.com/josiahsiegelデータ・データベース59162 回インストール19 週間前に更新
リポジトリ

azure-sql-optimization について

Azure SQL Database の管理者や開発者向けの最適化リファレンススキルです。性能監視、自動チューニング、接続設定、コスト管理に加え、Azure 固有の制約と対処法を扱います。

主な機能

  1. 01サービス階層、DTU、vCore の比較
  2. 02リソースとクエリの監視例
  3. 03自動チューニングと推奨事項の適用
  4. 04Hyperscale とサーバーレスの設定
  5. 05接続プーリング、再試行、コスト最適化

活用シーン

  1. 01ワークロードに合うサービス階層の選定
  2. 02CPU や I/O 負荷の高いクエリの調査
  3. 03自動一時停止と読み取りスケールアウトの設定
  4. 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 TBS0-S12 DTU
Premium高 I/O、低レイテンシ4 TBP1-P15 DTU
General Purpose (vCore)ほとんどのワークロード16 TBサーバーレスオプション
Business Critical高可用性4 TBインメモリ、読み取りレプリカ
Hyperscale大規模データベース100 TBストレージの自動スケーリング
DTU と vCore の比較
項目DTUvCore
料金リソースをまとめて提供コンピューティングとストレージを個別に提供
制御限定的細かく制御可能
予約容量なしあり(最大 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;
サーバーレスのベストプラクティス
  1. 断続的なワークロードに使用する - アイドル期間中のコストを節約できます
  2. 適切な最小 vCore 数を設定する - 時間制約のあるアプリのコールドスタートを防ぎます
  3. 自動一時停止を監視する - 自動再開によりレイテンシが発生します
  4. 一貫したワークロードでは常時稼働を検討する - プロビジョニング済みの方が安価な場合があります

接続の最適化

接続プーリング
// .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)
};
接続のベストプラクティス
  1. 接続プーリングを使用する - 接続のオーバーヘッドを削減します
  2. 再試行ロジックを実装する - 一時的な障害(エラー 40613、40197)に対処します
  3. リダイレクト接続モードを使用する - 初回接続後のパフォーマンスが向上します
  4. 接続を速やかに閉じる - 接続を不必要に保持しないでください

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 のコストに関する考慮事項
  • コンピューティング:秒単位の課金
  • ストレージ:使用済み領域に対する時間単位の課金
  • 読み取りレプリカ:追加のコンピューティングコスト
  • メモリは自動的に解放されません(適切に監視し、スケーリングしてください)

コメント