Google Bigquery加入“极慢”

时间:2018-11-03 00:24:55

标签: google-bigquery google-data-studio

我有一张桌子,大约有200万行 关键是,当我与具有60行的其他表进行左联接时,查询将变得非常缓慢。 我正在Data Studio中做报告,这并不是第一次在Bigquery中加入联接后,报告不再有用。 每次更改参数时,连接表所花费的时间超过40秒或1分钟。 如果未连接表,则查询将花费6或8秒。像普通查询一样。 我不知道问题出在Data Studio还是BigQuery中。有人可以帮我吗? 因为现在无法使用Bigquery通过Join在Data Studio中创建仪表板

以下两个查询不加入

SELECT
Tag_Id,
Image_Id,
Stream,
Tagging_Worker_Id,
Tagging_Worker_Name,
Tagging_Task_Id,
CASE WHEN Tagging_Time_Per_Tag > 200 THEN 200 ELSE Tagging_Time_Per_Tag END AS Tagging_Time_Per_Tag,
Tagging_Date,
Tagging_Class_Name,
Tagging_Class_Id,
Tagging_Template_Id,
Tagging_Top,
Tagging_Left,
Tagging_Width,
Tagging_Height,
Is_Tag_Adjusted,
Is_Class_Adjusted,
CASE WHEN (Is_Tag_Adjusted+Is_Class_Adjusted > 0) THEN 1 ELSE 0 END AS TagsAdjusted
FROM Stats.TaggingStats
where Tagging_Date>=  '2018-10-01'

具有加入权限

SELECT
  st.Tag_Id,
  st.Image_Id,
  st.Stream,
  st.Tagging_Worker_Id,
  st.Tagging_Worker_Name,
  st.Tagging_Task_Id,
  st.Tagging_Time_Per_Tag,
  st.Tagging_Date,
  st.Tagging_Class_Name,
  st.Tagging_Class_Id,
  st.Tagging_Template_Id,
  st.Tagging_Top,
  st.Tagging_Left,
  st.Tagging_Width,
  st.Tagging_Height,
  st.Is_Tag_Adjusted,
  st.Is_Class_Adjusted,
  st.TagsAdjusted,
  CASE
    WHEN (sal.Type_Salary=2 AND (st.Is_Tag_Adjusted=1 OR st.Is_Tag_Adjusted=1)) THEN 0
    WHEN sal.Type_Salary=1 THEN st.Tagging_Time_Per_Tag*sal.Salary_Per_Second
    WHEN sal.Type_Salary=2 AND st.Is_Tag_Adjusted=0 AND st.Is_Tag_Adjusted=0 THEN 3
    ELSE st.Tagging_Time_Per_Tag
  END AS CostPerTag,
  CASE
    WHEN sal.Type_Salary IS NULL THEN 'Workers Without Costing'
    WHEN Type_Salary=1 THEN 'Workers With Salary Per Hour'
    WHEN Type_Salary=2 THEN 'Workers With Fixed Price Per Tag'
    ELSE 'Error'
  END AS Costing_Method
FROM (
  SELECT
    Tag_Id,
    Image_Id,
    Stream,
    Tagging_Worker_Id,
    Tagging_Worker_Name,
    Tagging_Task_Id,
    CASE
      WHEN Tagging_Time_Per_Tag > 200 THEN 200
      ELSE Tagging_Time_Per_Tag
    END AS Tagging_Time_Per_Tag,
    Tagging_Date,
    Tagging_Class_Name,
    Tagging_Class_Id,
    Tagging_Template_Id,
    Tagging_Top,
    Tagging_Left,
    Tagging_Width,
    Tagging_Height,
    Is_Tag_Adjusted,
    Is_Class_Adjusted,
    CASE
      WHEN (Is_Tag_Adjusted+Is_Class_Adjusted > 0) THEN 1
      ELSE 0
    END AS TagsAdjusted
  FROM
    Stats.TaggingStats) st
LEFT JOIN
  Stats.Salary sal
ON
  sal.Tagging_Worker_Id=st.Tagging_Worker_Id
WHERE
  Tagging_Date>= '2018-10-01'

但是现在看一些数字后,我比以前更加困惑。手动运行查询,我可以看到所有不同的变体花费不到20秒。但是无论如何,这里有很多陌生的东西,Data Studio中的报表没有用。每次更改参数都花费一分钟以上。我试图将所有细节都放在这里。

第一个结论 可以做一些测试,我可以说带有CASE子句的查询不会比没有CASE子句的查询慢。实际上,有时花费的时间更少。

第二个结论 当查询表A的所有数据(200万行)时,时间几乎与查询表A的所有数据并与表B(60行)左连接的时间相同。因此,对于整个表来说,有或没有连接的时间几乎相同,并且只有400 MB的时间很多。仅当我使用Where子句达一个月时,差异才可见。

第三个结论 更改参数后,Google Data Studio报告需要90秒才能检索到数据。 Google Data Studio会自动生成不同的查询,以完成参数,记分卡和图表中的数据。每次更改参数时,Google Data Studio都会发送6个不同的查询来检索此数据。我分析了六个查询,然后将这个Google文档与每个查询的时间一起放入控制台中。 https://docs.google.com/document/d/1z_y5CqJW-LrLY5YyLXjSrc455RLUbklPxhnKmAS5zFk/edit?usp=sharing这六个查询中的每个查询都需要花费大约2.5秒的时间。我复制它们,然后手动运行。因此,如果他们需要一个接一个地处理一个秒,则总秒数必须在12秒左右。因此,这似乎是Google Data Studio从BigQuery检索数据的问题。耗时超过一分钟。不可能提供给客户。在进行加入之前,我正在以合理的时间响应来使用仪表板。但是JOIN似乎正在杀死Google Data Studio。我不知道。

我在这里留下支持结论1和2的数字https://docs.google.com/document/d/1sc3qjVpQrETofIgToJPIhZVs9HTjHsjTcrZvbt2NYcI/edit?usp=sharing,其中包含所有查询和变体,以分析join,case子句和where子句的影响。

在JOIN之前的查询在JOIN之前的查询和本月的where子句使用JOIN的查询和本月的where子句对所有表的JOIN的查询使用JOIN的查询和where子句本月和CASE子句使用TABLE和CASE子句的JOIN查询

其他问题: 差异:使用Big Query控制台手动运行时,我发现在运行同一查询时存在很多差异。我运行相同的查询三次。

运行1)查询完成(经过12.955秒,已处理490.83 MB)

运行2)查询完成(经过20.782秒,已处理490.83 MB)

运行3)查询完成(经过10.814秒,已处理490.83 MB)

1 个答案:

答案 0 :(得分:1)

您要加入两个表,这些表创建一个broadcast join,该表将所有数据发送到一个插槽中。另外,您正在做很多computation(案例)。所有这些都是查询花费更长的时间的原因。我建议reduce the data before the join和/或materialize the data

要更好地了解BigQuery的工作原理,可以查看此link