SQL Server 脳で学ぶ MySQL即効クエリチューニング の内容

[MySQL即効クエリチューニング ThinkIT Books ](https://www.amazon.co.jp/gp/product/B01N55MQVP) を読みながら解説されている内容を SQL Server で実施するためにはどのような手法があるかを考えながら書いたものです。

ページ数も手ごろで、とても読みやすかったです！！

# 第 2 章より

| MySQL | SQL Server |
|---|----|
|スローログ|[拡張イベント](https://docs.microsoft.com/ja-jp/sql/relational-databases/extended-events/extended-events?view=sql-server-ver15) / [SQL Server プロファイラ](https://docs.microsoft.com/ja-jp/sql/tools/sql-server-profiler/sql-server-profiler?view=sql-server-ver15) / [クエリストア](https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-ver15)|
|ジェネラルログ|[拡張イベント](https://docs.microsoft.com/ja-jp/sql/relational-databases/extended-events/extended-events?view=sql-server-ver15) / [SQL Server プロファイラ](https://docs.microsoft.com/ja-jp/sql/tools/sql-server-profiler/sql-server-profiler?view=sql-server-ver15)|
|バイナリーログ|sys.fn_dblog によるログファイルの直接参照 / レプリケーションを有効にし [sp_replcmds] (https://docs.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-replcmds-transact-sql?view=sql-server-ver15)|
|Percona Toolkit|[SQL Server First Responder Kit](https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit) / [tigertoolbox](https://github.com/Microsoft/tigertoolbox/tree/master)|

# 第 3 章より
| MySQL | SQL Server |
|---|---|
|EXPLAIN ステートメント|[SET SHOWPLAN_XML](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-showplan-xml-transact-sql?view=sql-server-ver15) / [SET SHOWPLAN_ALL](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-showplan-all-transact-sql?view=sql-server-ver15) / [SET SHOWPLAN_TEXT](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-showplan-text-transact-sql?view=sql-server-ver15) |
| ステータス変数 | セッション : [sys.dm_exec_session](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-sessions-transact-sql?view=sql-server-ver15), [SET STATISTICS TIME](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-statistics-time-transact-sql?view=sql-server-ver15), [SET STATISTICS IO](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-statistics-io-transact-sql?view=sql-server-ver15) / グローバル : [システム統計関数](https://docs.microsoft.com/ja-jp/sql/t-sql/functions/system-statistical-functions-transact-sql?view=sql-server-ver15), その他 DMV
| ANALYZE TABLE | [UPDATE STATISTICS](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/update-statistics-transact-sql?view=sql-server-ver15)|
| 統計情報サンプリングページ数 | [UPDATE STATISTICS](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/update-statistics-transact-sql?view=sql-server-ver15) のサンプリング設定 |
| EXPLAIN の解析 | [プラン表示の論理操作と物理操作のリファレンス] (https://docs.microsoft.com/ja-jp/sql/relational-databases/showplan-logical-and-physical-operators-reference?view=sql-server-ver15) |

## Memo 

SQL Server では次のようなことはできなさそう

- EXPLAIN で、どのインデックスが利用できるかを判断したか
    - 最終的に使われたインデックスのみが判断できる
- IGNORE INDEX による無効にするインデックスの指定
    - INDEX ヒントでどのインデックスを使用するかは指定できるが、無効にするインデックスについてのヒントはない (はず)
    - 変換ルールの調整でインデックス全体を使用しないようにすることはできるかもしれないが通常運用では実施しない


# 第 4 章より
| MySQL | SQL Server |
|---|---|
| PMP (Percona Monigoring Plugins) | [データコレクション](https://docs.microsoft.com/ja-jp/sql/relational-databases/data-collection/data-collection?view=sql-server-ver15) / SSMS のレポート機能 / [SQL Live Monitor] (https://github.com/glensmall/SQL-Live-Monitor)|

## Memo
現在の状況を表示するツール / ユーティリティはあるが、 for Cacti / for Zabbix / for Nagios のような監視ソリューションとの連携が行える機能が含まれるツールは知らない。
SCOM であれば Management Pack、Azure Monitoring Agent で SQL Server 関連の項目を連携し、Azure Monitor で監視ということはできる。
各社の監視ソリューションで SQL Server 向けのプラグインは出ているので、PMP for xxxx のような、情報を取得するソリューション起点での連携が考慮されていなくても大体はできるかと思うが。

# 第 5 章より
| MySQL | SQL Server |
|---|---|
|innotop| [利用状況モニター](https://docs.microsoft.com/ja-jp/sql/relational-databases/performance-monitor/activity-monitor?view=sql-server-ver15)|

## Memo
CUI で SQL Server の状況を確認するツール、何かあった気がするけど忘れた…。
スクリプトから、収集クエリを連続実行して、コンソールに出力して、状況を確認することはよくやる。
SQL Server 管理は、GUI が基本なので、SSMS  / Azure Data Studio で状況をウォッチすることが多いのではないか。
(監視ソリューションのソフトも基本的には、SQL Server のクエリを定期的に実行して、メトリクスを取得しているので)

# 第 6 章より
| MySQL | SQL Server |
|---|---|
| SHOW PROFILE |[ライブクエリ統計](https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/live-query-statistics?view=sql-server-ver15) / [軽量クエリプロファイリング] (https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/query-profiling-infrastructure?view=sql-server-ver15)|

## Memo
実行中のクエリに対してのアプローチであれば、軽量クエリプロファイリングで状況を確認することで、クエリの動作のトレースをとることも可能
Logical Tree, Physical Tree , Memo Structure でオプティマイザトレースのような、クエリ最適化を覗くことはできるが、各処理の時間の観点ではないので、クエリプロファイリング系の方が用途は近そう。


# 第 7 章より

| MySQL | SQL Server |
|---|---|
| Performance Schema | DMV / [sys.dm_os_performance_counters](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-os-performance-counters-transact-sql?view=sql-server-ver15) / [クエリストア](https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-ver15) /  [データコレクション](https://docs.microsoft.com/ja-jp/sql/relational-databases/data-collection/data-collection?view=sql-server-ver15)|
| sys | sys (DMV / システムビューは sys スキーマ配下)|

## Memo
SQL Server では、最新バージョンでも、データコレクションは明示的に有効にしないといけないため、運用環境で有効化されていない可能性は高い。
SQL Database では、クエリストアはデフォルトで有効だが、SQL Server はデフォルトでは有効になっていないため、クエリストアについても明示的に設定が必要。
DMV については、情報の取得は自動的に行われる (無効にできない) ため、DMV については、どの環境でも使用することはできる。

軽量なクエリプロファイリングについては、SQL Server 2016 SP1　以降で有効にすることができ、2019 / SQL Database ではデフォルトで有効であるため、初期環境でも使用できる。

MySQL のように情報取得の細かな設定の調整はできない