2015-11-19 41 views
0

我從BigQuery中得到一個錯誤,指出「JOIN表太大了,考慮使用JOIN EACH」,但是沒有任何顯式的聯接SQL語句。我看了另一個類似的問題,但我不明白他們給出的答案與我遇到的問題有關。「對於JOIN來說表格太大了,考慮使用JOIN EACH」但沒有聯接

'Too large to JOIN' error when I'm not using JOIN

這裏是SQL

SELECT 
userId AS userId, 
deviceId AS deviceId, 
MAX(CASE WHEN event_parameters.Name = 'Result' THEN event_parameters.Value END) AS ResultValue, 
MAX(CASE WHEN event_parameters.Name = 'Points' THEN event_parameters.Value END) AS _Points, 
MAX(CASE WHEN event_parameters.Name = 'Time' THEN event_parameters.Value END) AS _Duration, 
CASE WHEN event_name IN ('Level setA_lvl_01_onboarding Finished') THEN 1 WHEN event_name IN ('Level setA_lvl_02_onboarding Finished') THEN 2 WHEN event_name IN ('Level setA_lvl_03_onboarding Finished') THEN 3 WHEN event_name IN ('Level setA_lvl_04_onboarding Finished') THEN 4 WHEN event_name IN ('Level setA_lvl_05 Finished') THEN 5 WHEN event_name IN ('Level setA_lvl_06 Finished') THEN 6 WHEN event_name IN ('Level setA_lvl_07 Finished') THEN 7 WHEN event_name IN ('Level setB_lvl_01 Finished') THEN 8 WHEN event_name IN ('Level setB_lvl_02 Finished') THEN 9 WHEN event_name IN ('Level setB_lvl_03 Finished') THEN 10 WHEN event_name IN ('Level setB_lvl_04 Finished') THEN 11 WHEN event_name IN ('Level setB_lvl_05 Finished') THEN 12 WHEN event_name IN ('Level setC_lvl_01 Finished') THEN 13 WHEN event_name IN ('Level setC_lvl_02 Finished') THEN 14 WHEN event_name IN ('Level setC_lvl_03 Finished') THEN 15 WHEN event_name IN ('Level setC_lvl_04 Finished') THEN 16 WHEN event_name IN ('Level setC_lvl_05 Finished') THEN 17 WHEN event_name IN ('Level setA_lvl_08 Finished') THEN 18 WHEN event_name IN ('Level setA_lvl_09 Finished') THEN 19 WHEN event_name IN ('Level setA_lvl_10 Finished') THEN 20 WHEN event_name IN ('Level setA_lvl_11 Finished') THEN 21 WHEN event_name IN ('Level setA_lvl_12 Finished') THEN 22 WHEN event_name IN ('Level setA_lvl_13 Finished') THEN 23 WHEN event_name IN ('Level setA_lvl_14 Finished') THEN 24 WHEN event_name IN ('Level setB_lvl_06 Finished') THEN 25 WHEN event_name IN ('Level setB_lvl_07 Finished') THEN 26 WHEN event_name IN ('Level setB_lvl_08 Finished') THEN 27 WHEN event_name IN ('Level setB_lvl_09 Finished') THEN 28 WHEN event_name IN ('Level setB_lvl_10 Finished') THEN 29 WHEN event_name IN ('Level setB_lvl_11 Finished') THEN 30 WHEN event_name IN ('Level setC_lvl_06 Finished') THEN 31 WHEN event_name IN ('Level setC_lvl_07 Finished') THEN 32 WHEN event_name IN ('Level setC_lvl_08 Finished') THEN 33 WHEN event_name IN ('Level setC_lvl_09 Finished') THEN 34 WHEN event_name IN ('Level setC_lvl_10 Finished') THEN 35 WHEN event_name IN ('Level setC_lvl_11 Finished') THEN 36 WHEN event_name IN ('Level setC_lvl_12 Finished') THEN 37 WHEN event_name IN ('Level setA_lvl_15 Finished') THEN 38 WHEN event_name IN ('Level setA_lvl_16 Finished') THEN 39 WHEN event_name IN ('Level setA_lvl_17 Finished') THEN 40 WHEN event_name IN ('Level setA_lvl_18 Finished') THEN 41 WHEN event_name IN ('Level setA_lvl_19 Finished') THEN 42 WHEN event_name IN ('Level setA_lvl_20 Finished') THEN 43 WHEN event_name IN ('Level setA_lvl_21 Finished') THEN 44 WHEN event_name IN ('Level setB_lvl_12 Finished') THEN 45 WHEN event_name IN ('Level setB_lvl_13 Finished') THEN 46 WHEN event_name IN ('Level setB_lvl_14 Finished') THEN 47 WHEN event_name IN ('Level setB_lvl_15 Finished') THEN 48 WHEN event_name IN ('Level setB_lvl_16 Finished') THEN 49 WHEN event_name IN ('Level setB_lvl_17 Finished') THEN 50 WHEN event_name IN ('Level setB_lvl_18 Finished') THEN 51 WHEN event_name IN ('Level setC_lvl_13 Finished') THEN 52 WHEN event_name IN ('Level setC_lvl_14 Finished') THEN 53 WHEN event_name IN ('Level setC_lvl_15 Finished') THEN 54 WHEN event_name IN ('Level setC_lvl_16 Finished') THEN 55 WHEN event_name IN ('Level setC_lvl_17 Finished') THEN 56 WHEN event_name IN ('Level setC_lvl_18 Finished') THEN 57 WHEN event_name IN ('Level setC_lvl_19 Finished') THEN 58 WHEN event_name IN ('Level setC_lvl_20 Finished') THEN 59 ELSE 60 END AS _level, 
FROM 
TABLE_QUERY([dbset:dbname], "table_id CONTAINS 'game_table1' or table_id CONTAINS 'game_table2' or table_id CONTAINS 'game_table3'") 
WHERE 
event_name LIKE 'Level%Finished' 
GROUP BY 
userId, 
deviceId 

我懷疑問題是與「CASE WHEN EVENT_NAME IN」,作爲鏈接的問題表明,其中一個隱含的加入,所以我不知道如果在這裏也是這種情況,或者LIKE語句也可能成爲問題的一部分。

感謝, 布拉德

回答

1

這可以用半連接語句(即遵循的模式WHERE ... IN (SELECT ...)查詢)時有發生。您始終可以將半連接重寫爲JOIN,並且通常可以提供幫助,因爲您可以使用JOIN EACH(沒有IN EACH運算符)。

但是,您的查詢雖然有IN,但不是半連接(這是Mosha指出的)。正如他所要求的,如果您可以分享您的工作ID,BigQuery的其中一位工程師可以查看所發生的事情。

+0

但是在上面的查詢中,IN不是半連接,因此令人費解的是爲什麼有關JOIN的錯誤出現了。失敗查詢的jobid是什麼? –

+0

@Jordan如果問題在於JOIN操作太大,如何將JOY重寫爲JOIN幫助我? –

+0

好點,mosha,我看到了IN,只是假設它是半連接。 –

0

我同意摩沙和約旦,我們需要jobid,所以我們可以進一步調試這個問題。根本不清楚爲什麼您提供的查詢會導致加入。

但是,我想在這裏提到其他問題:通過使用連接替換長CASE語句,您可能會獲得更好的性能。我很困惑,首先你在那裏使用IN而不是=。如果你做了這個開關,我想你會得到相同的語義。

假設這是真的,那麼製作一個將「Level set *」字符串映射到整數的小維度表可能會更好,這樣您就可以將其返回到表中。

希望是有道理的。