マルチテーブルクエリを実行するには、次の2つの方法があります。
クエリ1:
select t1.a, t2.b from t1, t2 where t1.a = t2.a
クエリ2:
各行について:
select t1.a from t1
別のクエリを実行します。
select t2.b from t2 where t2.a = '??'
テーブルが非常に大きい場合、どちらがパフォーマンスが優れていますか?
マルチテーブルクエリを実行するには、次の2つの方法があります。
クエリ1:
select t1.a, t2.b from t1, t2 where t1.a = t2.a
クエリ2:
各行について:
select t1.a from t1
別のクエリを実行します。
select t2.b from t2 where t2.a = '??'
テーブルが非常に大きい場合、どちらがパフォーマンスが優れていますか?
常に、DBMSに1つのクエリで可能な限り多くの作業を行わせる必要があります。
DBMSは、各データベースにタプルがいくつあるかを認識しており、結果に含まれるタプルの数を見積もる方法があります。最新のDBMSには非常に複雑なアルゴリズムがあり、クエリを実行するための最も効率的な方法(プランナー)を見つける役割を果たします。
何をしているのか、なぜ実行しているのか(つまり、アルゴリズムがDBMSよりも高速に実行されることがわかっている場合、さらに重要なのはその理由)を理解していない限り、DMBSにその仕事を任せる必要があります。
あなたの質問にもっと正確に答える:
クエリ#1は、テーブルのサイズに応じて、さまざまな方法で答えることができます。両方とも巨大であると仮定しましょう。解決する1つの方法は、ソートベースの結合を使用することです。結合属性に基づいて両方のテーブルをソートしてから、それらをマージします。これは基本的に、各テーブルでマージソートを実行するのにかかる時間と同じです。各テーブルの各ページは、数回読み書きされます(DMBSで使用可能なバッファースペースの量によって異なります)。したがって、T1とT2の各タプルは、たとえば12回読み取り/書き込みされます。
メソッドを実装すると、T1のサイズのタプルと同じ数のクエリが発生します。T2にインデックスがないと仮定すると、クエリはT2T1のすべてのタプルをT1回読み取ります。
T2にインデックスがある場合は、T1のタプルごとに数ページを読むことが期待できます。したがって、クエリのコストはT1を読み取るコストであり、T1の各タプルについて、T2で一致するタプルを見つけるために数ページ(2〜5)を読み取る必要があります。
T1が非常に小さく、T2が非常に大きい場合、クエリ2の方が高速になります。ただし、DBMSはそれを検出し、正確にアルゴリズムを実行してQ1に応答します(ループベースの結合と呼ばれます)。さらに、DBMSに送信する各クエリの処理には時間がかかります(メソッド1にはないオーバーヘッド)。
これは、一般的なナイーブなDBMSプログラマーの間違いです。DBに少し作業をさせてから、すべてのタプルに対してさらに作業を行います。
代わりに、DBMSにすべての処理をできるだけ少ないクエリで実行させるという観点から考える必要があります。それはパフォーマンスで報われるでしょう。
最後に、パフォーマンスに本当に興味がある場合は、お気に入りのDMBSのドキュメントを入手して、クエリ評価がどのように行われるか、およびどのように改善できるかを読んでください。
--dmg