我们在按时间划分的Google BigQuery(按天划分)表中拥有数年的数据,我们希望使用资源管理器功能对其进行浏览。但是,资源管理器仪表板为我们编写的查询未正确使用这些分区。例如:
我想查看2018年9月1日至2018年9月5日的总收入和展示次数。我使用资源管理器选择日期作为维度,选择总收入和展示次数作为指标,并使用日期过滤器单击2018-09-01作为开始,并单击2018-09-05作为结束:
SELECT
SUM(t0.revenue) AS t0_qt_4bw5pro3qb,
SUM(t0.paid_impressions) AS t0_qt_63zplro3qb,
FORMAT_TIMESTAMP('%Y%m%d', TIMESTAMP(t0.date)) AS t0_qt_f1ghgro3qb
FROM
`project.dataset.table` AS t0
WHERE
FORMAT_TIMESTAMP('%Y%m%d', TIMESTAMP(t0.date)) BETWEEN '20180901'
AND '20180905'
GROUP BY
t0_qt_f1ghgro3qb
ORDER BY
t0_qt_f1ghgro3qb DESC;
这是资源管理器为我生成的查询。但是,如果我查看预计的成本,则表明成本将超过200MB。它没有正确使用分区。如果我更改以下内容:
WHERE FORMAT_TIMESTAMP('%Y%m%d', TIMESTAMP(t0.date)) BETWEEN '20180901'
AND '20180905'
到
WHERE date BETWEEN '2018-09-01' AND '2018-09-05'
查询成本降至上述成本的不到1%(1.47MB),这证实了我对原始资源管理器查询未正确使用分区表的怀疑。
如果我手动选择日期大于或等于20180901且小于或等于20180905的高级过滤器,则会生成以下查询:
SELECT
SUM(t0.revenue) AS t0_qt_4bw5pro3qb,
SUM(t0.paid_impressions) AS t0_qt_63zplro3qb,
FORMAT_TIMESTAMP('%Y%m%d', TIMESTAMP(t0.date)) AS t0_qt_f1ghgro3qb
FROM
`project.dataset.table` AS t0
WHERE
(t0.date >= PARSE_DATE('%Y%m%d', '20180901')
AND t0.date <= PARSE_DATE('%Y%m%d', '20180905'))
GROUP BY
t0_qt_f1ghgro3qb
ORDER BY
t0_qt_f1ghgro3qb DESC;
这会将大小缩小到1.47MB,从而使用适当的分区。
我真的很想使用常规的日期过滤器,因为与手动选择高级过滤器并添加一定的日期范围相比,它易于使用并且可以节省大量时间,尤其是在您频繁使用Explorer功能时
所以我不确定这是否是错误,或者我做错了什么。有问题的表格在日期列上按日期进行分区,日期列的类型为DATE,并以“ YYYY-MM-DD”格式存储日期。