2

Parent_TableとChild_Tableと呼ぶ多対1の関係を持つ2つのテーブルがあります(つまり、親には0個以上の子がありますが、子には1つの親があります)。何らかの条件を満たす子供が少なくとも1人いる親の数を数える必要があります。どのクエリが最適ですか?

オプション1(これではないことは間違いありません)

SELECT COUNT(DISTINCT(pt.ID)) 
FROM PARENT_TABLE pt
JOIN CHILD_TABLE ct
ON pt.ID =  ct.PARENT_ID
WHERE <parent meets some condition>
AND <child meets some condition>

オプション2

SELECT COUNT(pt.ID)
FROM PARENT_TABLE pt
WHERE pt.ID in
(
SELECT ct.PARENT_ID
FROM CHILD_TABLE ct
WHERE <child meets condition>
)
AND <parent meets some condition>

オプション3(私の推測では最速)

SELECT COUNT(pt.ID)
FROM PARENT_TABLE pt
WHERE EXISTS
(
SELECT 1
FROM CHILD_TABLE ct
WHERE ct.PARENT_ID = pt.ID
AND <child meets condition>
)
AND <parent meets some condition>

それともまったく別のものですか?各テーブルのサイズ、2つの条件の複雑さ、またはデータが並べ替えられているかどうかによって異なりますか?

編集:データベースはOracleです。

4

3 に答える 3

3

最初のクエリは遅く、他のクエリはほとんどの DB で高速に実行されるはずです。

DB を知らなければ、それ以上のことは言えません。

ただし、count(*) は count(names_field) よりも高速であることが多く、決して遅く
はありません count(distinct (afield)) は低速で ​​す

それとも、まったく別のものですか?

これは、DB と DB の正確なバージョンによって異なります。

各テーブルのサイズによって異なりますか

はい、それは大きな役割を果たします

または2つの条件の複雑さ

可能

またはデータがソートされているかどうか?

高速選択が必要な場合は、結合に使用されるすべてのフィールドにインデックスを付ける必要があります。
また、where 句で使用されるすべてのフィールドは、インデックス付けされているか、カーディナリティが低い必要があります。

于 2011-09-23T14:30:43.900 に答える
0

私にとっては、最初のものが最も読みやすいので最高のように思えますが、それは明らかにあなたの質問に答えていません.

実際に行う必要があるのは、各クエリの実行計画を生成して分析することです (一般的な DBMS のほとんどには、それを行うためのツールがあると思います)。各クエリのコスト値が表示されます。

それができない場合は、クエリを何度も実行して実行時間を比較できると思います。

それとも、まったく別のものですか?各テーブルのサイズ、2 つの条件の複雑さ、またはデータが並べ替えられているかどうかに依存しますか?

そのすべてとそれ以上。

于 2011-09-23T14:26:06.387 に答える
-1

コメント投稿者が言うように、この質問に答える最良の方法は、クエリを実行して測定することです。

ただし、一般に、データベースエンジンは結合を非常に効率的に最適化します。3つのクエリの間にほとんど違いはなく、クエリオプティマイザがそれらすべてを同じ基本クエリ(2と3)に変換する可能性は十分にあります。そのままでは同等です)。

クエリへの最大の影響は、「子がいくつかの条件を満たしている」および「親がいくつかの条件を満たしている」句です。このビットの最適化に集中します。

于 2011-09-23T14:28:37.477 に答える