※とりあえず更新するつもりだが忘れないうちに書いておく。
エンジニア歴8年目だが、Oracleのindexで新しいことを学んだので記録しておく。
なお内容は至極基本的なもののはずなので目新しいことを求めて来た方は、ブラウザバックでお願いします。。
逆に若手エンジニアの皆さん。エンジニアなんてこんなもんなんで、無知だから勉強しなきゃはOKですけど、 こんな事も知らないとか私ダサいのでは? とか思う必要ありません。
「聞くは一瞬の恥、聞かぬは一生の恥」。地道に知識を増やせばいいんです。
そして、必要になったときに必要なものを学べばよいのです。
取り急ぎ使わない上に役にも立たない知識を最初から学ぶのは工数がもったいないです。
(物理学科の学生が試験前に法律の勉強しないよね?すればいつかは役に立つかもだけど。そういうこと。あえてやる必要はない。と思っている。)
脱線しましたが本題へ。
INDEXてなに?のまえにKeyについて
RDBではPKとINDEXという大きく2つのものでデータの一意制を担保している。
(ER図出来にはOUTER_KEYとかもあるんでしょうけど一旦割愛)
PKは Primary Keyの略で、文字通りこのカラムが一意になるようなデータしか保存できないというもの
例)employeeテーブルにid、name、sectionと言うかラムが存在し、idがPKの場合
|id(PK) |name |section |
|----------|----------|----------|
|1 |TANAKA |JINJI |
|2 |SUZUKI |SOUMU |
|3 |TAKAHASHI |IT |
こういうデータに対し
INSERT INTO EMPLOYEE (id,name,section) VALUES (1,'TAKANKA','JINJI')
を実行すると 一意制約違反 で失敗する。
INSERT INTO EMPLOYEE (id,name,section) VALUES (4,'TAKANKA','JINJI')
を実行するとinsertされて、
|id(PK) |name |section |
|----------|----------|----------|
|1 |TANAKA |JINJI |
|2 |SUZUKI |SOUMU |
|3 |TAKAHASHI |IT |
|4 |TANAKA |JINJI |
となる。
データの一意性を担保するためのKeyがPKの役割。
じゃあINDEXてなに?
ここが学んだ内容。(今後まともな状態に更新かけるつもり。つ・も・り!)
私の浅はかな考えでは今まで SELECT文が速くなる。それは実行計画を作るときにINDEXがあると効率のいい実行計画になるからだ程度のことしか知らなかったが、
ORACLEでは(ほかは未調査)INDEXを貼った上で、UNIQUENESというものの設定ができ、
- UNIQUE
- NONUNIQUE
の2種類の設定ができるんだと。
- UNIQUE
になっていると実質PKと同じような役割になると。
つまりPKだけではなく INDEX の UNIQUENES も確認しないと、一意制約違反の本当の理由はわからないかもね。か・も・ね。
以上。