skillup

技術ブログ

Database

SQL結合 サブクエリに関して

投稿日:

今回はサブクエリに関してです。

もちろんSQL実践入門を読み進めています。

SQL上ではテーブル、ビュー、サブクエリというのは機能的にはそれほど変わらず主にパフォーマンスの点で違いがでてきます。

以下に簡単な特徴を述べます。

テーブル、ビュー、サブクエリの特徴

テーブル

永続的かつデータを保持する

ビュー

永続的だがデータは保持しないため、アクセスのたびにSQLが実行される

サブクエリ

非永続的なので生存期間(スコープ)がSQL文の実行中に限られる

サブクエリの問題点

ここでサブクエリの問題点を挙げておきます。

計算コストが上乗せされる

データを保持していないので、実行のたびにSELECTを実行してデータを作る必要があります。純粋にSELECT文実行にかかるコストが上乗せされます。

IOコストがかかる

計算した結果は、どこかに保持するため書き込む必要があります。うまくメモリに収まればよいですが、そうでない場合はストレージに書き込むことになり、遅延の原因になります。

最適化を受けられない

サブクエリにはインデックスが利かないため、最適化を受けることができません。

詳細はSQL実践入門の中にゆずりますが、サブクエリの中にはウィンドウ関数を使って代用できるものなどがかなり多くあります。この場合、ウィンドウ関数を使ったほうがパフォーマンスが良くなるケースがあるので積極的に利用しましょう。

-Database

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

SQL基礎 複雑なSQLの組み方

SQLの本を見ますとかなり複雑なSQLが書かれていることが多いです。 これは頑張っても無理では・・・と思っていましたが、ポイントしては 原則として必ず図に書く まずは問題を細かく分割する 細部から切り …

no image

JPAでのリレーションに関して

JPAではテーブルをクラスで定義します。もちろん例外とかはいろいろあるのですが、1テーブル1クラスというつくりで、これをエンティティと呼びます。 もともとクラスを作ってからDBを作成したり、JTAの規 …

no image

フィールド以外のプロパティをエンティティに持たせる

JPAでは基本的に1テーブル、1クラスです。 このためプロパティは必然的にテーブルのフィールドに対応しています。 ただ、必ずしもプロパティだけでなく、臨時で持たせておきたい、プロパティがあったりします …

no image

SQL 集計関数の利用

先日同様、ある程度複雑な問題のSQLに関して。出典はSQL実践入門。 問題 下記のようなテーブル(テーブル名)で より古い年のデータが存在しない場合 NULL 直近の年のデータより売り上げが伸びた場合 …

no image

CakePHPでの数字カンマ区切り&PHP&MySQL曜日の出力

今回は主に時間やお金の表示など、出力に関するネタです。 Contents1 Cakeでのカンマ区切り1.1 単純なカンマ区切り 例1,0001.2 \をつけるケース 例 \1,0001.3 円をつける …