【发布时间】:2018-06-05 06:41:27
【问题描述】:
我有一张包含以下详细信息的表格:
- 表格大小 39.6 MB
- 行数 691,562
- 2 列:contact_guid STRING、program_completed STRING
- 第 1 列数据类型类似于 uuid。大约 30 个字符长度
- 第 2 列数据类型是长度约为 50 个字符的字符串
我正在尝试这个查询:
#standardSQL
SELECT
cp1.contact_guid AS p1,
cp2.contact_guid AS p2,
COUNT(*) AS cnt
FROM
`data.contact_pairs_program_together` cp1
JOIN
`data.contact_pairs_program_together` cp2
ON
cp1.program_completed=cp2.program_completed
WHERE
cp1.contact_guid < cp2.contact_guid
GROUP BY
cp1.contact_guid,
cp2.contact_guid having cnt >1 order by cnt desc
执行时间:1200 秒
我知道我正在进行自加入,并且在最佳实践中提到了避免自加入。
我的问题:
- 我觉得这个以 mb 为单位的表大小对于 BigQuery 来说太小了,为什么要花这么多时间?就行数和字节大小而言,小表在连接上下文中对 BigQuery 意味着什么?
- 行数是否太大? 700k ^ 2 在连接期间是 10^11 行。联接的实际行数是多少?
- 我确实检查了有关连接的文档,但没有找到关于连接的表有多大以及它可以运行多长时间的信息。我们如何估算粗略的执行时间?
【问题讨论】:
-
我认为 BigQuery 不允许您添加索引,这可能对您的查询有帮助。您的表几乎有一百万条记录;运行时间并不让我感到惊讶。
-
1) 您能否发布运行查询后“详细信息”选项卡显示的执行时间线? 2) 你可以尝试加入 ... ON .. AND,而不是 JOIN ... ON ... WHERE?
-
@FelipeHoffa 我添加了执行时间表。将更新您建议的替代方案。
-
@TimBiegeleisen 我知道它几乎有 100 万条记录,但表太小了。只是想知道必须在没有索引的 Bigquery 中使用连接,通常我们会有包含这么多行的表。使查询工作或至少获得有关执行时间的粗略估计的方法是什么。我完全糊涂了。
-
我能提出的唯一建议是看看您是否可以使用分析函数重新表述您的查询。这可能会给您带来性能提升。
标签: google-bigquery