【发布时间】:2019-11-14 18:56:29
【问题描述】:
我有两个大小为 13 GB 和 1 GB 的表。表 1 有 1200 万行 * 1.6k 列,表 2 有 5k 行 * 160 列。 我正在对这两个表执行内部连接以查找所有匹配记录,如下面的示例查询,但查询似乎运行了很长时间,几个小时。结果连接的表大小为 29 GB,包含 900 万行。 我应该如何提高此操作的运行时间?我确实读过对表进行聚类可以提高性能。这是这种情况下的最佳选择吗?
SELECT
*
FROM
`myproject.table1` as t1
INNER JOIN
`myproject.table2` as t2
ON
(
t1.Camp1ID = t2.ID
OR t1.Camp2ID = t2.ID
OR t1.Camp3ID = t2.ID
OR t1.Camp4ID = t2.ID
OR t1.Camp5ID h = t2.ID
OR t1.Camp6ID = t2.ID
OR t1.Camp7ID = t2.ID
OR t1.Camp8ID = t2.ID
OR t1.Camp9ID = t2.ID
OR t1.Camp10ID = t2.ID
OR t1.Camp11ID = t2.ID
OR t1.Camp12ID = t2.ID
OR t1.Camp13ID = t2.ID
OR t1.Camp14ID = t2.ID
OR t1.Camp15ID = t2.ID
OR t1.Camp16ID = t2.ID
)
Where
t1.Date BETWEEN PARSE_DATE('%m/%d/%y', t2.StartDate) AND PARSE_DATE('%m/%d/%y', t2.EndDate)
阵营 ID 在这些列中不是唯一的,多行具有相同的阵营 ID。
【问题讨论】:
-
您的文字提到了两张表格,但您的问题只有一张。您正在使用
or和 20 列对表进行自联接。你知道这可能产生多少行吗?示例数据、所需结果以及对您想要的逻辑的解释都会有所帮助。 -
对不起它的表 2,不是自联接。期望的结果是有一个表,其中两个表中的所有列都具有匹配的行。
标签: sql join google-bigquery inner-join query-performance