优化产品范围查询的性能

Posted

技术标签:

【中文标题】优化产品范围查询的性能【英文标题】:Optimize the performance of product scoped query 【发布时间】:2019-02-15 16:03:13 【问题描述】:

我想每天建立下表,以存储有关网站页面性能的一些汇总数据。但是,每天的数据价值超过 1500 万行。

我可以采取哪些步骤来提高性能?我打算将它们保存为分片表,但我想进一步改进,我可以将数据嵌套在每个表中以进一步提高性能吗?最好的方法是什么?

SELECT
device.devicecategory AS device,
hits_product.productListName AS list_name,
UPPER(hits_product.productSKU) AS SKU,
AVG(hits_product.productListPosition) AS avg_plp_position

FROM `mindful-agency-136314.43786551.ga_sessions_20*` AS t
  CROSS JOIN UNNEST(hits) AS hits
  CROSS JOIN UNNEST(hits.product) AS hits_product
WHERE parse_date('%y%m%d', _table_suffix) between 
DATE_sub(current_date(), interval 1 day) and
DATE_sub(current_date(), interval 1 day)

AND hits_product.productListName != "(not set)"
GROUP BY 
device,
list_name,
SKU

【问题讨论】:

【参考方案1】:

由于您使用productSkuproductListName 作为维度/组,因此无法与product 数组交叉连接。

您还与 product 交叉连接,这可能很危险,因为有时该数组丢失并且您破坏了整行 - 通常您会使用左连接。但是在这种情况下,这很好,因为您只对产品领域感兴趣。

但是,您应该明确使用hits.product.isImpressionhits.product.isClick 查看列表点击次数还是列表展示次数。 Atm 我看不出有什么区别。在列表视图的情况下过滤WHERE hits_product.isImpression

您可能要考虑添加日期字段和PARTITION BY date 以及CLUSTER BY list_name,而不是分片。更新见INSERT Statement 和DDL Syntax 启动表格。在稍后查询表时,这比分片更高效。

启动表可能如下所示:

CREATE TABLE `x.y.z` 
PARTITION BY date
CLUSTER BY list_name
AS (
  SELECT
    PARSE_DATE('%Y%m%d',date) AS date,
    device.devicecategory AS device,
    hits_product.productListName AS list_name,
    UPPER(hits_product.productSKU) AS SKU,
    AVG(IF(hits_product.isClick, hits_product.productListPosition, NULL)) AS avg_plp_click_position,
    AVG(IF(hits_product.isImpression, hits_product.productListPosition, NULL)) AS avg_plp_view_position
  FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20*` AS t
    CROSS JOIN UNNEST(hits) AS hits
    CROSS JOIN UNNEST(hits.product) AS hits_product
  WHERE
    parse_date('%y%m%d', _table_suffix) 
    between 
      DATE_sub(current_date(), interval 1 day) 
      and DATE_sub(current_date(), interval 1 day)

  AND hits_product.productListName != "(not set)"
  GROUP BY 
    date,
    device,
    list_name,
    SKU
)

插入新记录非常相似,您只需按照文档中的说明预先提及字段即可。

【讨论】:

以上是关于优化产品范围查询的性能的主要内容,如果未能解决你的问题,请参考以下文章

高性能的索引策略5-案例学习

Presto 性能优化点

Mysql查询性能优化

HBase产品|数据查询的玄铁剑:云HBase原生二级索引发布

大表如何优化?

MySQL查询性能优化