我有一个奇怪行为的查询,因为在某些情况下它需要120秒和另外250秒。我必须尽量缩短执行时间,但找不到帮助我改进查询运行时的指南。
包含信息的表格具有以下特征:
查询是这样的:
SELECT
todayInfo.client AS Client,
todayInfo.todayInfo AS Today,
todayInfo.dayAgoInfo AS DayAgo,
todayInfo.threeDaysAgo AS ThreeDaysAgo,
todayInfo.weekAgo AS weekAgo,
FROM (
SELECT
client,
SUM(IF( bp_Time BETWEEN TIMESTAMP('2016/01/01')
AND TIMESTAMP('2016/01/31'),1,0)) AS todayInfo,
SUM(IF( bp_Time BETWEEN DATE_ADD(TIMESTAMP('2016/01/01'), - 1,"DAY")
AND DATE_ADD(TIMESTAMP('2016/01/31'), - 1,"DAY"),1,0)) AS dayAgoInfo,
SUM(IF( bp_Time BETWEEN DATE_ADD(TIMESTAMP('2016/01/01'), - 3,"DAY")
AND DATE_ADD(TIMESTAMP('2016/01/31'), - 3,"DAY"),1,0)) AS threeDaysAgo,
SUM(IF( bp_Time BETWEEN DATE_ADD(TIMESTAMP('2016/01/01'), - 8,"DAY")
AND DATE_ADD(TIMESTAMP('2016/01/31'), - 8,"DAY"),1,0)) AS weekAgo
FROM
[dataset.table]
GROUP BY
client
) AS todayInfo
ORDER BY
Today DESC
LIMIT 10
有一个指南可以帮助我优化运行时,不仅可以优化此查询,还可以帮助我优化未来的查询?
答案 0 :(得分:1)
由于BigQuery的工作方式,它不像关系数据库那样可调。它不使用索引,每个查询都是完整扫描。
话虽如此,您需要了解更多有关查询速度缓慢的原因。这在很大程度上取决于您的数据的具体情况。您可以使用query plan explanation来了解BigQuery花费时间的位置。
但是,正如评论中提到的@ Pentium10,您可能需要在白天对数据进行分区以减少扫描的大小。它在this answer中有更详细的解释。
答案 1 :(得分:0)
在这个link中,您可以找到有关BigQuery如何在幕后工作的更多信息。了解插槽是optimizing查询的关键。 Slots是计算容量的单位,数据在它们之间进行混洗,具体取决于连接,顺序,分组,函数,子查询等。
在你的情况下,你计算" SUM"," IF"," BETWEEN"在您的查询中,您需要更多计算。在您的情况下有用的一些功能是" DATE_SUB"和countif()。
SELECT countif((DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))=end_date) as AS dayAgoInfo from [dataset.table];