2015-09-25 56 views
0

我試圖運行此查詢,但它是,對我理解水平有限,荒謬緩慢。Bigquery查詢JOIN異常緩慢

下面是該查詢:

SELECT 
     STRFTIME_UTC_USEC(req.date, "%Y-%m-%d") AS day, 
     HOUR(req.date) AS hour, 
     10000*(COUNT(req.request_id) - COUNT(resp.request_id)) AS nb_bid_requests, 
     COUNT(resp.request_id) AS nb_bid_responses, 
    FROM 
     [server.Request] req 
    LEFT JOIN EACH 
     server.Response resp 
    ON 
     req.request_id = resp.request_id 
    WHERE 
     DATEDIFF(CURRENT_TIMESTAMP(), req.date) < 3 
    GROUP EACH BY 
     day, 
     hour 
    ORDER BY 
     day, 
     hour 

什麼錯誤我最深的是,這個完全相同的查詢工作完全正常上具有相同的數據集,表和字段(具有相同的數據類型的生產項目,名)。唯一的區別是生產比Dev有更多的數據。

我不是任何情況下的SQL專家,我很樂意被告知我在哪裏可以改進查詢。

預先感謝您。

編輯:嗨,解決了這個問題。 這是由大量的request_id在服務器中重複引起的。響應減慢了「一點點」的查詢速度。

+0

統計差異?多少日期(與開發者相比)?次2次,10次,100次甚至更多? – jarlh

+0

在prod中,您運行我們的系統,這會大量使用我們的基礎架構。在Dev上運行時,您可以模擬相同的操作,但需要使用自己的計算機。這可能發生在這裏。 (當然假設你是指本地開發服務器,而不僅僅是一個不同的環境) – Patrice

+0

給我們一些數字,數據有多大,查詢的持續時間,輸出大小,你運行的頻率? – Pentium10

回答

0

嘗試在連接內部向下推WHERE子句。

BigQuery的優化器尚未推送連接內的謂詞,因此您發佈的查詢將加入全部的數據,然後對其進行過濾,而不是隻加入您關心的部分。如果您在請求和響應中都有date字段,請在連接的兩側放置過濾器!

如果您無法過濾連接的兩側,請切換兩側,以使較小(已過濾)的表位於右側。由於BQ連接的實現方式,如果較小的表格在右側,它們通常會表現得更好。

SELECT 
    STRFTIME_UTC_USEC(req.date, "%Y-%m-%d") AS day, 
    HOUR(req.date) AS hour, 
    10000*(COUNT(req.request_id) - COUNT(resp.request_id)) AS nb_bid_requests, 
    COUNT(resp.request_id) AS nb_bid_responses, 
FROM 
    server.Response resp 
RIGHT JOIN EACH 
    (
     SELECT * 
     FROM 
      [server.Request] 
     WHERE 
      DATEDIFF(CURRENT_TIMESTAMP(), date) < 3 
    ) req 
ON 
    req.request_id = resp.request_id 
GROUP EACH BY 
    day, 
    hour 
ORDER BY 
    day, 
    hour