大量のデータを含む 2 つのテーブルがあります。
ACTION_SUMMARYとACTION_DETAIL
すべてのユーザーはACTION_SUMMARY、私のデータベースに 1 日あたり 1 行ありACTION_DETAIL、ACTION_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.DATE、AS.AS_ID、AD.AS_IDおよびにインデックスがありますAD.ACTYP_ID
ありがとう