大量のデータを含む 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
ありがとう