3

クロス結合を含むクエリを最適化しようとしています。派生テーブルとの相互結合に進む大きなクエリがあります。

派生テーブルをビューに変換することで、クエリの速度が向上しますか?または、その情報を永続的なテーブルにキャプチャすることもできますか?

これが私の質問です

SELECT  VIEWER_ID, 
        QUESTION_ID, 
        ANSWER_ID, 
        sum(ANSWER_SCORE) AS ANSWER_SCORE_SUMMED
FROM(SELECT  cr.COMMUNICATIONS_ID AS ANSWER_ID, 
        cr.CONSUMER_ID as VIEWER_ID,
        nc.PARENT_COMMUNICATIONS_ID AS QUESTION_ID,
        case when  cr.CONSUMER_ID= nc.SENDER_CONSUMER_ID then 3*((24/(((UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(cal.LAST_MOD_TIME)+3600)/3600))*(ces.EXPERT_SCORE * cirm.CONSUMER_RATING) + (12.5 * scs.SIMILARITY)* (1 - EXP(-0.5 * (cal.TIPS_AMOUNT / ATV.AVG_TIPS)) + .15)))
            else ((24/(((UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(cal.LAST_MOD_TIME)+3600)/3600))*(ces.EXPERT_SCORE * cirm.CONSUMER_RATING) + (12.5 * scs.SIMILARITY)* (1 - EXP(-0.5 * (cal.TIPS_AMOUNT / ATV.AVG_TIPS)) + .15)))
        end as ANSWER_SCORE
FROM (SELECT 234 AS CONSUMER_ID, 
             ACTION_LOG_ID, 
            COMMUNICATIONS_ID 
     FROM consumer_action_log 
     WHERE COMM_TYPE_ID=4) AS cr
JOIN network_communications AS nc 
    ON cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID
JOIN consumer_action_log AS cal 
    ON cr.ACTION_LOG_ID=cal.ACTION_LOG_ID
JOIN communication_interest_mapping AS cim 
    ON nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID
JOIN consumer_interest_rating_mapping AS cirm 
    ON cr.CONSUMER_ID=cirm.CONSUMER_ID
    AND cim.CONSUMER_INTEREST_EXPERT_ID=cirm.CONSUMER_INTEREST_ID
JOIN consumer_expert_score AS ces 
    ON nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
    AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID
JOIN survey_customer_similarity AS scs 
    ON cr.CONSUMER_ID=scs.CONSUMER_ID_2 
    AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_1 
    OR cr.CONSUMER_ID=scs.CONSUMER_ID_1 
    AND cal.SENDER_CONSUMER_ID=scs.CONSUMER_ID_2
CROSS JOIN
    (
        SELECT AVG(cal.TIPS_AMOUNT) AS AVG_TIPS
        FROM CONSUMER_ACTION_LOG AS cal
        JOIN (SELECT 234 AS CONSUMER_ID, 
                     ACTION_LOG_ID, 
                     COMMUNICATIONS_ID 
              FROM consumer_action_log 
              WHERE COMM_TYPE_ID=4) AS cr 
        ON cal.SENDER_CONSUMER_ID=cr.consumer_id
    ) ATV) AS ASM
GROUP BY ANSWER_ID
ORDER BY ANSWER_SCORE_SUMMED DESC;

長いクエリなので、すべてを読む必要はありません。要点は、単にクロスジョインがあるということです。私はSQLを初めて使用しますが、クロス結合によって速度が低下すると言われています。

4

2 に答える 2

3

そのため、2番目のインラインクエリは1行しか返さないため、クロス結合はそれほど重要ではありません。

クロスは、車の積載が速度を落とすのと同じ方法で「速度を落とす」に参加します。

もちろんそうですが、物を動かす必要がある場合は車に積み込み、デカルト積が必要な場合はクロス結合を行います。

于 2011-01-28T16:55:23.810 に答える
1

クロス結合が遅いかどうか(何よりも?;))が質問の場合、単純化された答えは「はい」です。もちろん、これは一般的な質問に対する非常に一般的な答えです。しかし、あなたにとっては、どれだけ遅いかを定量化する必要があります。

すべての実用的な目的のために、クエリは可能な限り高速である可能性があります。したがって、検証するには、クエリでExplain Planを実行します(私はオラクルの人ですが、mysqlでExplainPlanを実行することはそれほど違いはないと思います。リンクhttp://dev.mysql.com/doc/refman/5.0/en/explain .html)。

次に、一時テーブルを作成し、クエリ内のテーブルを置き換えて、プランを再度確認します。

注:クエリの説明計画が十分に適切であることがわかった場合は、さらに分析するために時間を無駄にする必要はありません。

于 2011-01-28T17:19:04.000 に答える