#レスポンスってなんだ
実務でプログラミングをはじめ、実際に自分が組んだものが客先に納品される。
しっかりテストされている環境ならば、客先にいってバグってたなんてことは少ないだろう。
しかし、レスポンスまではなかなか確認できない。
データが増えた、数ヶ月後「なんか処理遅いんだけど・・・」
なんてよくある話ですよね。
正直、調査がめんどくて時間がかかるし、なんだか難しい用語がたくさん出てきて、逃げがち。
でもこの仕事に携わる以上、避けては通れない。
じゃあ立ち向かうしかないじゃないか。
詳しい人はよく言う「SQLの気持ちになれば、簡単」
最初聞いた時はなんやねんそれという感じでしたが、実際に立ち向かうには本当にそれしかない。
じゃぁどうしたらオプティマイザの気持ちになれるか。
相手を知るしかない。
じゃぁ初級からでも勉強しよう。
ちょいちょいパフォーマンスチューニングをしてきた経験はあれど、
先輩方の教えと曖昧な知識しかないことがオプティマイザとお友達になれない原因!
ということで初歩の初歩から確認していきます。
##インデックスってなんだ
インデックスを知らない人は多分いない。
でもどういう役割で、なにを、どこまでできるかってたぶん自分も理解していない。
###インデックスとは
「検索のパフォーマンスを向上させる」ための機能。
インデックスが存在しない場合は、どんなデータを検索する場合でも、必ずテーブルの先頭から最後まで探し続けなければならない。
###実際に作ってみよう
Shainテーブル
NO | Name | Age |
---|---|---|
1 | Ooi | 48 |
2 | Ubukata | 35 |
3 | Kato | 20 |
4 | Mano | 28 |
5 | Endou | 38 |
6 | Wtarai | 40 |
・・・ |
CREATE INDEX TR_Name
ON Shain(Name)
この社員テーブルに対して、インデックスを作成し、Endouで検索した場合の処理イメージ
実際にインデックスを使ってみる。
SELECT Name
FROM Shain
WHERE Name = 'Endou'
実際に作成したインデックスを利用して、Index Seek出来ているのがわかります。
ここで上げているのは最も簡単な非クラスタ化インデックスの例です。
ここまでは理解するの簡単。
でもこうしてみると・・・
SELECT *
FROM Shain
WHERE Name = 'Endou'
先程のインデックスが利用されず、クラスタ化インデックスのIndex Scanになってしまっていることがわかります。(データ件数を増やすとまた別の実行プランが採用されます)
この辺の対応を複合インデックスや、負荷列インデックスでか行けるする必要がある。
そこが結構難しい。複雑だし。
この辺の設定方法を今後も記事にしていきたいと思います。
##おわりに
記事を作成していて思いましたが、正直データベースの構造やらオプティマイザの仕組みもまとめないと最終的にお友達になれそうもないです。
インデックスから取り上げたのは微妙だった気がしてきた。。。。