0

大量のデータを含む 2 つのテーブルがあります。

ACTION_SUMMARYACTION_DETAIL

すべてのユーザーはACTION_SUMMARY、私のデータベースに 1 日あたり 1 行ありACTION_DETAILACTION_SUMMARY.

いくつかの値セットにアクション タイプ ( ) を持つ詳細レコードが少なくとも 1 つあるユーザーを返すクエリが必要ACTYP_IDです。

以下に一例を示します。

select
    AS.USER_ID
from
    ACTION_SUMMARY AS
    JOIN ACTION_DETAIL AD on AS.AS_ID = AD.AS_ID
where
    AS.DATE between '2015-01-01' and '2015-07-07'
    and AD.ACTYP_ID in (45, 25, 11)

AS.DATEにインデックスがあります。ただし、DB には 200 万人を超えるユーザーがいて、各サマリーには平均で 5 ~ 10 の詳細レコードがあるため、パフォーマンスの問題が発生しています。

私はEXISTSこの方法で使用することを考えていました:

select
 AS.USER_ID
from
    ACTION_SUMMARY AS
where
    AS.DATE between '2015-01-01' and '2015-07-07'
    and EXISTS (select 1 from ACTION_DETAIL AD where AD.AS_id = AS.AS_ID and AD.ACTYP_ID in (45, 25, 11))

ここで、2 つの質問があります。

1)私のクエリはEXISTSより高速です-サブクエリは何かを見つけて移動するとすぐに停止しますか?

2) クエリを改善するにはどうすればよいですか?

AS.DATEAS.AS_IDAD.AS_IDおよびにインデックスがありますAD.ACTYP_ID

ありがとう

4

1 に答える 1

0

existsより遅くすべきではありませんjoin。しかし、本当に知りたい場合は、両方を実行してみてください。

select AS.USER_ID
from ACTION_SUMMARY AS
where AS.DATE between '2015-01-01' and '2015-07-07' and
      EXISTS (select 1
              from ACTION_DETAIL AD
              where AD.AS_id = AS.AS_ID and AD.ACTYP_ID in (45, 25, 11)
             );

このクエリに最適なインデックスは、 action_summary(date, as_id, user_id)およびaction_detail(as_id, actyp_id)です。これらは、複数の列を持つ複合インデックスであることに注意してください。

于 2015-04-02T21:05:22.147 に答える