2016-12-22 80 views
2

我試圖讓查詢更高效地運行並返回有效的結果。當我在特定列中包含COUNT函數時,我當前的查詢需要10多分鐘才能完成。我也注意到,在計數時,所有結果都返回爲NULL。查詢效率 - 計數

當我自己運行COUNT部分時,完成時間不到一秒鐘,我得到正確的結果。

這裏是我使用的查詢:

SELECT 
    x.entityCode 'Entity Code' 
, (SELECT MAX(visit_date) AS secMaxDate FROM z_dev.entities_visited 
      WHERE entity_code = x.entityCode AND visit_date < x.maxDate) ' Previous Visit Date' 
, x.maxDate 'Latest Visit Date' 
, cycle_end_date 'Cycle End Date' 
, total_visits 'Total Visits (28 Days)' 
FROM 
    (SELECT 
     entity_code AS storeCode 
    , MAX(visit_date) AS maxDate 
    , MAX(cycle_end_date) AS cycle_end_date 
    , (SELECT COUNT(visit_date) FROM z_dev.entities_visited A 
      WHERE visit_date BETWEEN DATE(DATE_SUB(CURDATE(), INTERVAL 28 DAY)) AND DATE(DATE_SUB(CURDATE(), INTERVAL 0 DAY) AND A.entity_code = B.entity_code) 
      GROUP BY entity_code) AS 'total_visits' 
    FROM 
     z_dev.entities_visited B GROUP BY entity_code) AS X; 

樣本數據

entity_code | visit_date | cycle_end_date 
------------+------------+--------------- 
108792  |2016-12-07 |2016-12-11  
108793  |2016-12-08 |2016-12-11  
108795  |2016-12-06 |2016-12-11  
108796  |2016-12-05 |2016-12-11  
108795  |2016-12-13 |2016-12-18  
108792  |2016-12-14 |2016-12-18  
108793  |2016-12-14 |2016-12-18  
108796  |2016-12-16 |2016-12-18 



    Field   | Type  | Key 
    ----------------+-----------+--------------- 
    entity_code  |bigint(10) |MUL 
    visit_date  |date  |  
    cycle_end_date |date  |MUL  

的總訪問次數的計數是我添加到查詢解決方案,我與昨天輔助部分。基本上我想看到的是以下三件事情:

  • 當被訪問了實體的最後日期(目前由 x.maxDate給出)
  • 當是最後的實體之前,參觀人數最多最近 訪問(目前由「先前的訪問日期」定)
  • 多少次是實體過去28天內

當前問題方面富有經驗訪問/結果

  • 慢查詢時間(10分鐘+)
  • 算子查詢返回的所有NULL值
  • 數查詢運行在它自己的回報預期的結果在幾個預期結果在幾秒鐘內
  • 主查詢返回秒
+1

如果您可以讓我們知道您正在計算的內容,這將有所幫助。您當前的查詢看起來效率低下並且很混亂。也許我們可以給你一個更好的替代方案。 –

+0

Gut反應表示確保你在'entities_visited'上有一個索引'(entity_code,visit_date DESC)',但是對於所有性能問題,你可以在你的查詢中發佈當前索引和'EXPLAIN'的結果? –

+0

謝謝你們,我添加了一些額外的信息 –

回答

0

謝謝,我想我一直在想這個問題,這就是爲什麼我沒有得到預期的結果。

我現在有我的查詢按預期方式運行。

SELECT 
    x.entityCode 'Entity Code' 
, (SELECT MAX(visit_date) AS secMaxDate FROM z_dev.entities_visited 
      WHERE entity_code = x.entityCode AND visit_date < x.maxDate) ' Previous Visit Date' 
, x.maxDate 'Latest Visit Date' 
, cycle_end_date 'Cycle End Date' 
, visits 'Total Visits (28 Days)' 
FROM 
    (SELECT 
     entity_code AS entityCode 
    , MAX(visit_date) AS maxDate 
    , MAX(cycle_end_date) AS cycle_end_date 
    , (SELECT COUNT(visit_date) AS visits WHERE visit_date BETWEEN DATE(DATE_SUB(CURDATE(), INTERVAL 28 DAY)) AND DATE(DATE_SUB(CURDATE(), INTERVAL 0 DAY))) AS visits 
    FROM 
     z_dev.entities_visited B GROUP BY entity_code) AS X 
GROUP BY 
    x.entityCode;