Устранение перекрестного соединения в SQL - PullRequest
3 голосов
/ 28 января 2011

Я пытаюсь оптимизировать запрос, содержащий перекрестное соединение. У меня большой запрос, который я перехожу к перекрестному соединению с производной таблицей.

Повысит ли это скорость запроса, превратив производную таблицу в представление? Или даже захват этой информации в постоянной таблице?

Вот мой запрос

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, но мне сказали, что кросс-соединения замедляют скорость.

Ответы [ 2 ]

3 голосов
/ 28 января 2011

Таким образом, ваше перекрестное соединение не является чем-то особенным, потому что второй встроенный запрос возвращает только одну строку.

Крест объединяет «скорость замедления» так же, как замедляется загрузка автомобиляскорость.

Конечно, но если вам нужны перемещенные вещи, вы загружаете их в машину, а если вам нужен декартово произведение, вы делаете перекрестное соединение.

1 голос
/ 28 января 2011

Если ваш вопрос, если кросс-соединения медленнее? (Чем что?;)), То упрощенный ответ - да.Конечно, это очень общий ответ на общий вопрос.Но для вас вам нужно определить, насколько медленно.

Для всех практических целей ваш запрос может быть настолько быстрым, насколько это возможно.Таким образом, чтобы проверить, запустите объяснение плана по вашему запросу (я - оракул, но я предполагаю, что выполнение плана объяснения в MySQL не так уж и отличается.запросите и проверьте план еще раз.

Примечание. Если план объяснения для вашего запроса окажется достаточно хорошим, вам не придется тратить время на дальнейший анализ.

...