スッキリわかるSQL入門を一通り読むことができましたため、読んでみて、良かったところや学んだこと、改善点を記載します!
良かったところ
ドリルが256問あるところ
技術書の中にはドリルがついておらず、技術の説明しか書かれていないものもありますが、本書は256問もあるため、自身がインプットした内容でどこらへんを理解していないのかを明確にできる点は良かったと思います!私自身はトランザクション、インデックス、テーブル設計の分野に関する理解が浅かったため、今後はその分野を重点的に復習していきます。
SQL文を丸暗記ではなく、理解できる
SQLには集計関数(COUNT、SUM、AVG、MIN、MAX
など)ではwhere
は使用できませんが、その理屈を理解していない状況でした😵
そのためすぐにルールを忘れたり、エラーに遭遇した際にググって解決しても忘れるという状況でした、、
ですが、本書には理屈が書かれているため、丸暗記にはならず、理屈を理解できるように書かれているため、頭に残りやすいと思いました。
上記の例で挙げたwhereで集計関数を使えない理由として、集計関数はテーブルを検索した結果、集計していることやSQLの実行順序としてはwhere
は集計される前のため、where
で集計関数は使用できないことを学びました。
SQLは FROM→WHERE→GROUP BY→HAVING→SELCT→ORDER BYの順で実行されます。
新しい視点でSQLに関する知識を整理できる
今まで私が持っていなかった視点を本書では提供していただけたため、SQLに関する理解が深まったことです。
例えば、今までSELECT、UPDATE、DELTE、INSERTを分類分けすると、参照系のSELECTと更新系のUPDATE、DELTE、INSERTです。この書籍には他の分類分けの仕方も紹介していただいており、新規データのINSERTと既存データのSELECT、UPDATE、DELTEです。さらに、WHEREが使用できるのは、既存データで、新規データでは使用できないという説明も目からウロコが落ちました🤩
学んだこと
インデックスによって、パフォーマンスが改善するパターンやデメリット
インデックスを定義するとSQLのパフォーマンスが改善することやインデックスの作成方法は把握していたものの、どのカラムにインデックスを定義するとパフォーマンスが改善するのかをちゃんと理解できていなかったため、勉強になりました。
具体的には以下のカラムに対してインデックスを定義するとパフォーマンスが改善します。
- order by
- whereの完全一致、前方一致
- joinの結合条件
whereの部分一致、後方一致はインデックスによって、パフォーマンスが改善しません。
一方、インデックスを定義するデメリットもあります。UPDATE、DELTE、INSERTのような更新系の処理はテーブルのデータだけでなく、インデックスの情報も更新しなければいけなくなってしまうため、それによって、更新系の処理のオーバヘッドが増えてしまいます。
トランザクションについて
前職でOracleデータベースを使用していたものの、Oracleでは明示的にトランザクション(BEGIN〜COMMIT)を定義しなくても利用できてしまっていたため、勘違いしていたことや新たに学ぶことがありました!
-
今まではUPDATE、INSERTを発行したら、テーブルにロックがかかると思っていたのですが、そうではなく、トランザクションによって、テーブルにロックが掛かっていることを学びました。Oracleだと自動的にトランザクションが利用できていたため、そのように勘違いをしておりました😅
-
ロックによって、ロックが解除されるまでトランザクションは待ち時間が発生してしまい、パフォーマンスが低下してしまいますが、トランザクション分離レベルを指定することで、パフォーマンスと分離レベルを調整できることを知りました。
-
トランザクション分離レベルのREAD UNCOMMITTED
- 他のトランザクションからUPDATE、DELTE、INSERTなどの更新処理されないようになっているため、自身のトランザクションの中でクエリを複数発行しても同じ結果になります。
- 一番安全ですが、パフォーマンスが一番低くなってしまいます。
-
トランザクション分離レベルのREAD COMMITTED
- 他のトランザクションからUPDATEは実行されないため、自身のトランザクションの中でクエリを複数発行しても同じ結果になります。
- SERIALIZABLEみたいにDELTE、INSERTを実行されてしまったら、クエリを複数発行しても同じ結果にならないことがあります。SERIALIZABLEよりは安全性にかけますが、パフォーマンスは良いです。
-
トランザクション分離レベルのREPEATABLE READ
- 多くのDBMSではデフォルトの設定
- 自身のトランザクションでUPDATE、DELTE、INSERTがCOMMITされるまでは他のトランザクションからは変更中のデータを参照できない。
改善点
ドリルがついていることは嬉しかったのですが、そのドリルの解説がほぼなく、解答しかなかったため、第4版では解説が充実していることを期待しております🥺