3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

インデックスとは①

Last updated at Posted at 2020-07-22

#レスポンスってなんだ

実務でプログラミングをはじめ、実際に自分が組んだものが客先に納品される。
しっかりテストされている環境ならば、客先にいってバグってたなんてことは少ないだろう。

しかし、レスポンスまではなかなか確認できない。

データが増えた、数ヶ月後「なんか処理遅いんだけど・・・」
なんてよくある話ですよね。

正直、調査がめんどくて時間がかかるし、なんだか難しい用語がたくさん出てきて、逃げがち。
でもこの仕事に携わる以上、避けては通れない。
じゃあ立ち向かうしかないじゃないか。

詳しい人はよく言う「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で検索した場合の処理イメージ
image.png

実際にインデックスを使ってみる。

SELECT Name
FROM Shain
WHERE Name = 'Endou'

実行プラン
uploading-0
image.png

実際に作成したインデックスを利用して、Index Seek出来ているのがわかります。
ここで上げているのは最も簡単な非クラスタ化インデックスの例です。
ここまでは理解するの簡単。

でもこうしてみると・・・

SELECT *
FROM Shain
WHERE Name = 'Endou'

image.png

先程のインデックスが利用されず、クラスタ化インデックスのIndex Scanになってしまっていることがわかります。(データ件数を増やすとまた別の実行プランが採用されます)

この辺の対応を複合インデックスや、負荷列インデックスでか行けるする必要がある。
そこが結構難しい。複雑だし。
この辺の設定方法を今後も記事にしていきたいと思います。

##おわりに
記事を作成していて思いましたが、正直データベースの構造やらオプティマイザの仕組みもまとめないと最終的にお友達になれそうもないです。
インデックスから取り上げたのは微妙だった気がしてきた。。。。

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?