2013-10-08 94 views
1

花了超過18分鐘,運行我們的測試數據集以下查詢:爲什麼我的Google BigQuery查詢花了這麼長時間?

SELECT count(distinct S1.visitorId, 50000) as returningVisitors, 
STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)), '%Y-%m-%d') AS day, 
S1.dimension1, S1.dimension2 
FROM [myDataset.MyTable] as S1 
JOIN EACH [myDataset.MyTable] as S2 on S1.visitorId= S2.visitorId 
WHERE UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)) < UTC_USEC_TO_DAY(NOW()) and 
S2.timeStamp < STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)), '%Y-%m-%d') 
GROUP EACH BY S1.dimension1, S1.dimension2, day 
ORDER BY S1.dimension1, S1.dimension2, day; 

在我的網頁瀏覽器下面的消息結束: 「查詢完成(1112.1s經過,1.62 MB處理)「

我想知道爲什麼花了這麼長時間。 BigQuery通常會有更快的結果。

該查詢在同一個表上進行JOIN以獲取每天和維度的返回訪問者數量。我預計查詢可能需要5-6分鐘,但不是18分鐘,特別是因爲表格不是那麼大。

我的表格大約有31000行,總大小爲4.25 Mb。 我的工作id是:job_b657aceeb1004994b0b0332d461cdcd2

+0

我編輯了查詢表上的細節。該表甚至比我想象的要小得多:31000行,總大小爲4.25Mb。 – YABADABADOU

回答

3

這個查詢仍然需要那麼長的時間來處理?如果只發生一次,「爲什麼」可能是一個罕見的內部性能問題。

告訴我,如果我得到這個權利:你自己加入表的唯一原因是檢查用戶是否曾經在那裏?在這種情況下,您正在生成指數級增長(我是否正確使用這個詞?)組合數,而不需要。該查詢僅引用S2一次,以檢查它是否小於當前行的時間戳日。

如果更換什麼:

JOIN EACH [myDataset.MyTable] as S2 on S1.visitorId= S2.visitorId 

有:

JOIN EACH 
(SELECT visitorId, MIN(timeStamp) timeStamp FROM [myDataset.MyTable] GROUP EACH BY 1) S2 
ON S1.visitorId= S2.visitorId 

獲得:

SELECT count(distinct S1.visitorId, 50000) as returningVisitors, 
STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)), '%Y-%m-%d') AS day, 
S1.dimension1, S1.dimension2 
FROM [myDataset.MyTable] as S1 
JOIN EACH 
(SELECT visitorId, MIN(timeStamp) timeStamp FROM [myDataset.MyTable] GROUP EACH BY 1) S2 
ON S1.visitorId= S2.visitorId WHERE UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)) < UTC_USEC_TO_DAY(NOW()) and 
S2.timeStamp < STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)), '%Y-%m-%d') 
GROUP EACH BY S1.dimension1, S1.dimension2, day 
ORDER BY S1.dimension1, S1.dimension2, day; 

一些注意事項: - 這樣你的查詢可以被緩存

  • 嘗試與一個具體的日期時間NOW替換()。
+0

今天早上花了12分鐘在相同的數據集上再次執行此查詢。順便說一下,我編輯了查詢表的詳細信息。它以爲我在一張更大的桌子上做了我的查詢。這是一個31000行表,大小隻有4.25Mb。現在我將嘗試您提出的新查詢並向您提供相關消息。 – YABADABADOU

+1

您提出的查詢比我原來的要好得多!現在只需9秒就可以在同一張桌子上得到結果。我在我們的prod數據(19百萬行)上試了一下,並且花了60秒知道這個查詢的複雜性真的很好。非常感謝你的幫助:) – YABADABADOU

+0

耶!樂於幫助 :) –

相關問題