web-dev-qa-db-ja.com

PostgreSQL左結合選択VS通常選択

どちらが速いのか疑問に思いました-複数の選択を1つの結合選択に結合するか、実際に別々の選択を行う方が速いですか?

多くのテーブル(現在は4つですが、おそらく増えるでしょう)が相互に関連しているタスクを実行しており、LEFTJOINを使用してそれらを選択します。 postgresqlにそのようなSQLクエリを実行すると、それは限界を超えますか?

あなたの経験からどう思いますか:)

1
tftd

答えは「データベースによって異なります」ですが、一般的にはクエリをJOINとして記述する方が読みやすく、クエリプランナーに何をしているかについてのヒントを提供するためです。

PostgresにEXPLAIN(またはEXPLAIN ANALYZE)クエリのクエリプランを作成し、実質的な違いがあるかどうかを確認します。同時に、インデックス作成など、最適化できる他のいくつかのことも見つけることができます。 EXPLAINの使用の詳細については、 Postgresマニュアル を参照してください。

2
voretaq7

一般的に、各クエリを準備するためのコストとデータを取得するためのコストがあります。小さなデータセットの場合、ループでSELECTを実行することはそれほど悪くありませんが、1000行のテーブルでSELECTを実行している場合、それらの行ごとに、1000行の別のテーブルで別のSELECTを実行します。ループ選択が事前に準備されたクエリから実行された場合でも、非常に目立ちます。

ループ内の各クエリを準備するコストがゼロであっても、JOINされた要素によって取得されるデータの合計サイズが減少する可能性があります。たとえば、一致する行が1つしかないテーブルに対して1000行のテーブルを結合する場合、クエリのJOINバージョンは1行を返しますが、個別のSELECTは最初のテーブルから1000行を返し、ループは999を生成します。空のセットと1行。

行のセットをループするのではなく、各テーブルから1つの特定のアイテムを要求する場合、1つの「大きな」クエリと4つの小さなクエリの違いはおそらくごくわずかです。 voretaq7が言ったように、postgresqlに各クエリが何をするのか、そしてそれを行うのにどれくらいの時間がかかるのかを説明させることは、何が起こるかを正確に理解するのに大いに役立ちます。

2
DerfK