SQL ServerでSQLチューニングする際に抑えておくべきポイント~4億レコードを持つテーブルから学んだこと~

こんにちは、WalletStation開発チームの浅田です。

普段はインフキュリオンでWalllet Stationの新規機能開発や

設計改善、リファクタリング、テストコードの拡充などをやっています。


この記事では、

SQL ServerSQLチューニングする際に必要となる

インデックスの種類と内部の仕組みについての解説。


また、

性能問題にぶつかった際の原因調査の仕方と

SQLチューニングの進め方などについての解説。


そして、このあたりの

僕が現場で実際で実践しているやり方を紹介致します。



解決したい課題(この記事のゴール)

  • SQL Serverで発生した性能問題の原因切り分けができるようになる

  • SQL ServerSQLチューニングができるようになる(レコード数が数億規模でも)


そのために・・・

  1. SQL Serverのインデックスの種類と仕組み

  2. SQL Server Management Studio(以下、SSMS)で実行計画取得~確認~分析~SQLチューニング

という流れで見て行きます。



SQL Serverのインデックスの仕組みと種類

以前動画と別のブログで僕が解説したことがあるのでこのあたりをご覧ください。


www.youtube.com

poppingcarp.com



SSMSで実行計画を取得~確認~分析~SQLチューニング

以前動画と別のブログで僕が解説したことがあるのでこのあたりをご覧ください。


www.youtube.com

poppingcarp.com



まとめ

SQL Serverで数億規模のレコードを持つテーブルのSQLチューニングをするためには、

まず、SQL Serverのインデックスの種類を知り、データを取得・更新する際に、

インデックスがどのように利用されているのか

イメージを持つことが大切だと考えます。


そのイメージがある人は、

実行計画を見て性能問題の原因切り分けの際の仮説の精度が高い印象です。



インデックスの種類と仕組みを知ると、

実際にSSMSでクエリの実行計画を取得して分析したり、

インデックスを貼って実行計画が変わることを確認したり分析してみると、

よりインデックスについての理解が深まります。



また、普段から実行計画を意識できるようになると、

そもそも性能問題にならないクエリが書けるようになるので、

性能問題の発生自体を減らせるようになると思います。



ここからはオマケで・・・

個人的なSQLチューニングができるようになるためのオススメ練習方法について少し紹介します。



今携わっているシステムの、とあるテーブルの、

とあるインデックスを貼っていないカラムを条件にSELECTするクエリを作り、

実行計画を取ってみて、

table scanもしくはindex scanになることを確認する。



今度はそのカラムにnon-clustered indexを貼ってみて、

index seekになることを確認する。(Key-LookupかRIO-Lookupしてるはず)



さらにindexを付加列indexにしてincludeにselect項目を入れてみる。

そうするとLookupなしでindex seekだけでデータにアクセスできるようになる。



ここまでを手を動かして実際に体験し、

もう一回この記事を読み直せば、

SQL Serverのインデックスに対しての理解度はさらに深まり、

SQLチューニングはある程度できるようになっていると思います。



是非手を動かしてSQLチューニングを体験して、

性能問題を解決するスキルを付けてみてください。

その際、この記事がお役に立てば幸いです。