🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

5534閲覧

条件で絞ったサブクエリ同士のJoinと全件Joinした後のwhere

ms5025

総合スコア292

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/11/16 14:44

条件で絞ったサブクエリ同士をJoinするのと
全件Joinした後where句で絞るのは
速度的にはどちらが早いのでしょうか?

確かUnionの場合は
条件を絞った者同士Unionするのと
全件Union後、where句で条件指定するのはかかる時間が同じだった記憶があります
(エビデンスとりました。オラクルですが)

また、可読性はどちらが高いとされるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

条件で絞ったサブクエリ同士をJoinするのと
全件Joinした後where句で絞るのは
速度的にはどちらが早いのでしょうか?

適切なテーブルの設計(インデックスも含め)が行われている場合、どちらでも実行計画が同じになる場合はあります。

SQLでの基本は取り出す集合に纏めて(join)から抽出(where)ですから、結合条件と抽出条件を分ける方が可読性は高いと思います。

チューニングの観点からは母集合が条件により小さくなることが多い場合、抽出してから纏める場合はあります。

想定したデータを準備できないなら、適切な設計をした上で可読性の高い記述にしておき、データが準備できた段階でチューニングを行うという手順になるかと思います。

スロークエリーを抽出できるようにしておき、遅いクエリーが検知できるようにしておくのが良いかもしれません。

投稿2019/11/17 06:53

sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ms5025

2019/11/17 10:07

ありがとうございます! >チューニングの観点からは母集合が条件により小さくなることが多い場合、抽出してから纏める場合はあります。 この場合もUNIONの場合ですが 数万件のデータ同士をUNIONした後whereで1件取得の条件をかけても 1件ずつ抽出したデータ同士をUNIONしても実行計画の速度は同等でした。 なので、この母数が・・・の件も、正しくインデックスが貼られている場合は 同等なのかな?と疑問に思って質問してみましたが あまりにも抽象的だったようで申し訳なく思っています。 昔ほど正しくテーブル設計がされていればデータ抽出時間を気にすることはなくなったので、 気が向いたらエビデンスとってみたいと思います。
sazi

2019/11/17 10:16 編集

unionを気にされているのですか? unionする必要があるという事は正規化がされていないという事なので、正しい設計ではありませんね。 oracleの古いバージョンでは、正規化はされているけど遅いので、orをわざわざunion展開して高速にするという事はあったと思いますけど。
guest

0

質問の曖昧過ぎる内容できちんと答えられる人はいません。

実際にCREATE TABLE, CREATE INDEX, 各テーブルのレコード件数と ON, WHEREで絞り込んだレコード件数、SELECT文を提示されれば PostgreSQLの実行計画 である程度予測できますが、実際にどちらが早いか確認するためには実測する必要があります。

PostgreSQL タグの過去の質問を探せば参考になる質問が見つかるかも?

投稿2019/11/16 15:48

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ms5025

2019/11/16 15:56

ありがとうございます。 一応一般的なよくある日付やidなどで絞ったトランザクションテーブルのセレクトをイメージしていましたが レコード件数や条件の数によって、絞った後のJoinかJoin後の絞り込みかで 時間が左右される、ということなのでしょうか。 実行計画の方を見てみます。 Unionに関しては絞り込み後Unionしても 全件Union後の条件句での絞り込みも同じ実行計画で動くというのは覚えていたのですが LeftJoin等の結合はどうなのか気になりまして。
Orlofsky

2019/11/16 16:12

回答に書いたように具体的な内容を書かないと適切なコメントは付きません。 UNIONとJOINは違います。 ここの掲示板は質問を修正できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問