0

テーブル A には 500,000 件のレコードがあります。

id, text, created, b_id

テーブル B には 20,000 件のレコードがあります。

id, text

A.b_id is FK to b.id

したがって、次のことを行うと:

SELECT text, created, (SELECT b.text FROM b WHERE b.id = A.b_id) FROM a WHERE created < now()

またはまた

SELECT text, created, (SELECT b.text FROM b WHERE b.id = A.b_id) FROM a LIMIT 0,10

サブセレクトはWHERE句の後に実行されるので、実際にはレコードに対してのみ実行されwhere created < now()ます。最初の 10 レコードのみで実行されますか?それとも、除外が発生する前にすべてのレコードで実行されますか?

ありがとう!

4

2 に答える 2

2

SQL 結合について学習する必要があります。たとえば、次のようになります。

SELECT a.text, a.created, b.text
FROM   a JOIN b ON b.id = a.b_id
WHERE  a.created < NOW()
LIMIT  0, 10

ただし、相関サブクエリに関する質問に答えるには:

サブセレクトは WHERE 節の後に実行されるので、実際には作成された < now() resp のレコードに対してのみ実行されます。最初の 10 レコードのみで実行されますか?それとも除外が発生する前にすべてのレコードで実行されますか?

サブクエリは、フィルター/制限が適用された後、親クエリによって返されたレコードに対してのみ評価されます。

于 2013-07-13T16:01:03.500 に答える
0

サブクエリは単独では実行されません。クエリ全体は、クエリ プランナーによって、外部結合を使用したクエリに似たものに変換されます。

したがって、サブクエリは、他のテーブルのすべてのレコード、または中間結果のすべてのレコードに対して実行されるわけではありません。これは、メイン クエリと組み合わせて 1 回実行されます。

クエリ プランがどの程度正確に終了するかは、テーブルにあるインデックスと、テーブルの統計がクエリ プランナーに伝える内容によって異なります。

于 2013-07-13T16:12:38.650 に答える