查询调优Bigquery

时间:2016-02-08 14:23:29

标签: google-bigquery query-tuning

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

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

  1. 所有字段都重复
  2. 它有8亿条记录
  3. 流程14.2 GB
  4. 查询是这样的:

    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
    

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

2 个答案:

答案 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];