2

我有一个奇怪行为的查询,因为在某些情况下它需要 120 秒和另外 250 秒。我必须尽量减少执行时间,但找不到帮助我改善查询运行时间的指南。

包含信息的表格具有以下特征:

  1. 所有字段都重复
  2. 它有8亿条记录
  3. 进程 14.2 GB

查询是这样的:

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

有一个指南或提示可以帮助我优化运行时,不仅是这个查询,还有未来的查询?

4

2 回答 2

2

由于 BigQuery 的工作方式,它不像关系数据库那样可调。它不使用索引,每次查询都是一次全扫描。

话虽如此,您需要更多地了解为什么您的查询很慢。这在很大程度上取决于您的数据的具体情况。您可以使用查询计划说明来很好地了解 BigQuery 将时间花在哪里。

但是,正如@Pentium10 在评论中提到的那样,您可能必须按天对数据进行分区以减少扫描的大小。在这个答案中有更详细的解释。

于 2016-02-08T15:28:35.877 回答
1

在此链接中,您可以找到有关 BigQuery 如何在幕后工作的更多信息。了解槽是优化查询的关键。插槽是计算能力的单位,数据在它们之间随机排列,具体取决于连接、排序依据、分组依据、函数、子查询等。

在您的情况下,当您在查询中计算“SUM”、“IF”、“BETWEEN”时,您需要更多的计算。在您的情况下有用的一些功能是“ DATE_SUB ”和countif()

SELECT countif((DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))=end_date) as AS dayAgoInfo from [dataset.table];
于 2018-04-23T21:18:54.450 回答