簡體   English   中英

sql查詢與子查詢優化

[英]sql query with subqueries optimization

我是SQL的初學者,下面的子查詢存在問題。 我設置子查詢的原因是,我需要對列進行排序和分組,而不是對主表上的數據進行排序。 還有其他方法可以優化此查詢嗎? 它已超時,並且已運行30分鍾以上。 我想避免盡可能多地重新掃描piwik_log_visit表。 有沒有一種方法只能按特定列排序或分組? 感謝您的幫助。 謝謝!

Set @theDate = cast('2015-11-26 08:00:00' as datetime);

SELECT  t2.idorder AS 'Order ID',
        (
            SELECT  COALESCE(NULLIF(t3.referer_name,''), 'Direct')
            FROM    piwik_log_visit t3
            WHERE   conv(hex(t3.idvisitor), 16, 10) = conv(hex(t2.idvisitor), 16, 10) 
            AND     t3.visit_first_action_time >= (@theDate - INTERVAL 32 DAY)
            ORDER BY t3.visit_last_action_time DESC
            limit 1
        ) AS 'Referrer (Last)',
        (
            SELECT  COALESCE(NULLIF(t4.referer_name,''), 'Direct')
            FROM    piwik_log_visit t4
            WHERE   inet_ntoa(conv(hex(t4.location_ip), 16, 10)) = inet_ntoa(conv(hex(t1.location_ip), 16, 10)) 
            AND     t4.visit_first_action_time >= (@theDate - INTERVAL 32 DAY)
            GROUP BY inet_ntoa(conv(hex(t4.location_ip), 16, 10))
            ORDER BY t4.visit_first_action_time
            limit 1
        ) AS 'Referrer (IP:First)',
        t1.referer_url AS 'Referrer URL'
FROM    piwik_log_visit t1, 
        piwik_log_conversion t2
WHERE   conv(hex(t1.idvisitor), 16, 10) = conv(hex(t2.idvisitor), 16, 10) 
AND     t2.idorder IS NOT NULL 
AND     t2.server_time BETWEEN '2015-11-25 07:59:59' AND '2015-11-26 08:00:00' 
AND     t1.visit_first_action_time >= (@theDate - INTERVAL 32 DAY)
GROUP BY t2.idorder

說明計划:

http://screencast.com/t/3loUAUkTe

性能不佳的主要原因是由於表之間的連接條件。 由於涉及的列上的數據轉換,它們無法用索引優化。 如果沒有索引,則這些連接變為笛卡爾連接,然后通過評估連接表達式對其進行過濾。

為什么需要在t1.idvisitor和t2.idvisitor上進行轉換? 將加入條件更改為簡單

WHERE t1.idvisitor = t2.idvisitor

將有很大的幫助。 與t3和t4相同。

嘗試不使用conv(hex(),,)。

Set @theDate = cast('2015-11-26 08:00:00' as datetime); SELECT t2.idorder AS 'Order ID', ( SELECT COALESCE(NULLIF(t3.referer_name,''), 'Direct') FROM piwik_log_visit t3 WHERE t3.idvisitor = t2.idvisitor AND t3.visit_first_action_time >= (@theDate - INTERVAL 32 DAY) ORDER BY t3.visit_last_action_time DESC limit 1 ) AS 'Referrer (Last)', ( SELECT COALESCE(NULLIF(t4.referer_name,''), 'Direct') FROM piwik_log_visit t4 WHERE t4.location_ip = t1.location_ip AND t4.visit_first_action_time >= (@theDate - INTERVAL 32 DAY) GROUP BY t4.location_ip ORDER BY t4.visit_first_action_time limit 1 ) AS 'Referrer (IP:First)', t1.referer_url AS 'Referrer URL' FROM piwik_log_visit t1, piwik_log_conversion t2 WHERE t1.idvisitor = t2.idvisitor AND t2.idorder IS NOT NULL AND t2.server_time BETWEEN '2015-11-25 07:59:59' AND '2015-11-26 08:00:00' AND t1.visit_first_action_time >= (@theDate - INTERVAL 32 DAY) GROUP BY t2.idorder

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM