-3

2 つのテーブルがあり、どちらも約 300000 の値を持っています。技術的な理由により、タイムスタンプまたは 1 つの一意の ID で直接照合することはできません。

しかし、この結果を取得したいと思います:

SELECT * FROM adsDelivered
         JOIN pageViews ON (
            adsDelivered.session = pageViews.session and 
            adsDelivered.referer = pageViews.referer and 
            abs(unix_timestamp(adsDelivered.timeCreated) - unix_timestamp(pageViews.timeCreated)) <= 5
         ) 
         WHERE pageViews.timeCreated >= '2013-03-21 00:00:00' and 
               pageViews.timeCreated <= '2013-03-21 23:59:59' 
         LIMIT 100

フィードバックが大きすぎて、時間がかかります。

4

2 に答える 2

2

クエリで EXPLAIN PLAN を実行することをお勧めします。TABLE SCAN が表示された場合は、インデックスを効果的に使用するためにクエリを書き直す必要があることがわかります。

JOIN 行をすべてスキャンしてtimeCreated、どの行が WHERE 句を満たすかを確認する必要があるためです。

スキャンする必要があるセットのサイズを削減する操作を行うと、非常に役立ちます。インデックスを使用することも役立ちます。WHERE 句の列が適切にインデックス付けされていることを確認してから、それらを利用できるようにクエリを書き直してください。

于 2013-03-21T12:36:58.727 に答える
0

データにインデックスを追加する方法を見つけられない限り、処理を高速化する方法はありません。

現時点でのオーバーヘッドは、両方のテーブルをスキャンするときに、潜在的な一致ごとに abs と unix_timestamp を呼び出していることです。

計画を説明し、何が起こっているかを確認するための私の唯一の提案です。それは次善の最適化である可能性があり、join を使用せず、代わりに where 句を次のように使用することで改善できる場合があります。

SELECT * 
FROM adsDelivered, pageViews
WHERE adsDelivered.session = pageViews.session
AND adsDelivered.referer = pageViews.referer
AND abs(unix_timestamp(adsDelivered.timeCreated) - unix_timestamp(pageViews.timeCreated)) <= 5
AND pageViews.timeCreated >= '2013-03-21 00:00:00'
AND pageViews.timeCreated <= '2013-03-21 23:59:59' 
LIMIT 100
于 2013-03-21T12:42:09.903 に答える