SQL実践入門第7章を読んだ
サブクエリとビューやテーブルの違い、メリット・デメリットを端的にまとめる。
テーブル、ビュー、サブクエリ
テーブル
- 永続的かつデータを保持する
ビュー
- 永続的だがデータを保持しない(ので、アクセスのたびにSELECT文が実行される)
サブクエリ
- 非永続的なので生存期間がSQL文の実行中に限られる(これを永続化したものがビュー)
テーブルとサブクエリの違い
機能的観点
- 違いは無い
非機能的観点(特にパフォーマンス)
- テーブルに比べてサブクエリ(またはビュー)の方がパフォーマンスが悪い傾向にある
サブクエリの問題点
計算コストが上乗せされる
- サブクエリにアクセスするたびにSELECT文を実行するコストがかかる(書いてなかったけど多分ビューも同様)
データのI/Oコストがかかる
- 計算結果がメモリに乗り切らずTEMP落ちしたり、そもそもDBMSが計算結果をファイルに書き出すことを選択した場合にアクセス速度が急激に劣化する
最適化を受けられない
- テーブルと違い、制約やインデックスなどのメタ情報が存在しないため、オプティマイザがクエリを解析するために必要な情報がサブクエリの結果から得られない
サブクエリを使うことが許される(望ましい)ケース
- 結合の対照表が巨大な場合、サブクエリで先に結合の行数を絞るチューニングが考えられる
まとめ
- サブクエリは結合を増やしパフォーマンスを悪化させることがある
- 結合が増えるとI/Oコストが上がるため(SQLのパフォーマンスはかなりI/Oに影響を受ける)
- サブクエリと結合をウィンドウ関数で代替することでパフォーマンスを改善できる可能性がある
- サブクエリによって事前に結合の対照となる表を絞ることによってパフォーマンスを改善できる可能性がある