【问题标题】:Google BigQuery optimization with subquery in WHERE clause在 WHERE 子句中使用子查询进行 Google BigQuery 优化
【发布时间】:2021-02-17 11:58:09
【问题描述】:

我正在尝试设置一个查询,该查询从 Google Analytics(分析)会话数据的一系列每日分区中选择数据子集,并将数据写入 Google BigQuery 临时表。我面临的挑战是在 WHERE 子句中使用子查询时降低处理成本。

查询中的 Google Analytics(分析)数据在被处理并加载到目标数据表 (my-data-table) 之前,将被附加到临时表中。主要查询以以下两种形式给出。第一个是硬编码。第二个反映了首选形式。 _TABLE_SUFFIX 的上限是硬编码的,以简化查询。目标是使用来自 my-data-table 的 MAX(date),其中 date 的格式为 YYYYMMDD,作为 ga_sessions_* 每日分区的下限。该查询已在此处进行了简化,但据信包含所有必要的元素。

聚合查询 (SELECT MAX(date) FROM my-project-12345.dataset.my-data-table) 返回值“20201015”并处理 202 KB。根据我是在主查询的 WHERE 子句中显式使用返回值(如“20201015”)还是在 WHERE 子句中使用 SELECT MAX() 查询,两个查询之间处理的数据存在显着差异(2.3 GB 用于显式值,而 138.1 GB 用于 SELECT MAX() 表达式)。

是否有优化、计划或指令可以应用于主查询的首选形式,从而降低数据处理成本?感谢您提供的任何帮助。

主查询(硬编码版本,处理 2.3 GB)

SELECT
  GA.date, 
  GA.field1, 
  hits.field2, 
  hits.field3
FROM 
  `my-project-12345.dataset.ga_sessions_*` AS GA, UNNEST(GA.hits) AS hits
WHERE 
  hits.type IN ('PAGE', 'EVENT')
  AND hits.field0 = 'some value'
  AND _TABLE_SUFFIX > '20201015'
  AND _TABLE_SUFFIX < '20201025' 

主查询(首选形式,未优化处理 138.1 GB)

SELECT
  GA.date, 
  GA.field1, 
  hits.field2, 
  hits.field3
FROM 
  `my-project-12345.dataset.ga_sessions_*` AS GA, UNNEST(GA.hits) AS hits
WHERE 
  hits.type IN ('PAGE', 'EVENT')
  AND hits.field0 = 'some value'
  AND _TABLE_SUFFIX > (SELECT MAX(date) FROM `my-project-12345.dataset.my-data-table`)
  AND _TABLE_SUFFIX < '20201025' 

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    您可以为此使用脚本

    “诀窍”在于预计算

    DECLARE start_date STRING;
    SET start_date = (SELECT MAX(date) FROM `my-project-12345.dataset.my-data-table`);    
    

    并分配给变量,然后在主查询的 where 子句中使用此变量 - 在这种情况下,它将使用具有成本效益的版本

    AND _TABLE_SUFFIX > start_date
    AND _TABLE_SUFFIX < '20201025' 
    

    【讨论】:

    • 感谢您指导我使用变量。在我的搜索中添加“变量”可提供更多信息。我试试看。
    • 声明和设置 start_date 变量会阻止使用“查询设置”或“计划查询”配置来指定查询输出的目标表。 CREATE OR REPLACE TABLE AS SELECT... 应该这样做。
    • CREATE OR REPLACE TABLE 在脚本中不起作用:无法为脚本设置 configuration.query.writeDisposition
    • CREATE OR REPLACE TABLE 给出了上面提到的错误消息(不能为脚本设置 configuration.query.writeDisposition)。我在问题的开头描述中包含了将数据写入临时表的目标。我会跟进的。谢谢。
    • 同样,如果你觉得这个问题很好,我欢迎反馈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2019-12-15
    相关资源
    最近更新 更多