关于查询效率的建议:2个不同的版本

时间:2018-02-18 23:02:29

标签: google-cloud-platform google-bigquery

其中哪一个是更有效的查询运行:

在WHERE子句中包含/不包含过滤条件并为每行测试的一个

SELECT distinct fullvisitorid
FROM `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910` t, unnest(hits) as ht
WHERE (select max(if(cd.index = 1,cd.value,null))from unnest(ht.customDimensions) cd) 
       = 'high_worth'

一个返回所有行,然后外部SELECT子句执行所有过滤测试到INCLUDE / DO NOT INCLUDE

SELECT distinct fullvisitorid
FROM 
    (
     SELECT 
        fullvisitorid
        , (select max(if(cd.index = 1,cd.value,null)) FROM unnest(ht.customDimensions) cd) hit_cd_1
     FROM `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910` t
          , unnest(hits) as ht
     )
WHERE
   hit_cd_1 = 'high_worth'

两者产生完全相同的结果! 目标是:fullvisitorId列表,曾发送过命中级自定义维度(index = 1),其值为''high_worth'用户()

感谢您的投入!

干杯!

/ Vibhor

2 个答案:

答案 0 :(得分:1)

我尝试了两个查询并比较了他们的explanations,它们完全相同。我假设在查询运行之前发生了某种优化魔法。

答案 1 :(得分:0)

从您最初的两个查询开始:显然-即使您稍微重新排列了外观,它们也是相同的。因此,您应该从这两个中选择更易于阅读/维护的内容。我会选择第一个查询-但这实际上是个人喜好问题

同时,请尝试以下方法(BigQuery Standard SQL)-对我来说,它似乎有些优化-但我没有机会对真实数据进行测试

SELECT DISTINCT fullvisitorid
FROM `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910` t, 
UNNEST(hits) AS ht, UNNEST(ht.customDimensions) cd
WHERE cd.index = 1 AND cd.value = 'high_worth'  

很明显-它应该产生与您的两个查询相同的结果
执行计划对我来说更好,它(查询)更快,更易于阅读/管理