使用 LEFT OUTER JOIN 或 Anti-join 的 BigQuery 过滤器

Oof*_*Oof 6 google-bigquery

我可以想到 2 种在 Google BigQuery 中进行过滤的方法。(假设表 2 很小。)哪种过滤方法更可取,为什么?它取决于table1的大小吗?或者还有其他更好的方法吗?

SELECT
  a.ID
FROM
  table1 AS a
LEFT OUTER JOIN
  table2 AS b
ON
  a.ID = b.ID
WHERE 
  b.ID is NULL
Run Code Online (Sandbox Code Playgroud)

或者

SELECT
  ID
FROM
  table1
WHERE
  ID NOT IN (
    SELECT
      ID
    FROM
      table2)
Run Code Online (Sandbox Code Playgroud)

Mik*_*ant 7

第二个仅限于一个且只有一个要过滤的字段。

First 可用于按多个字段过滤,如下所示

SELECT
  a.ID
FROM
  table1 AS a
LEFT OUTER JOIN
  table2 AS b
ON
  a.ID = b.ID AND a.Field2 = b.Field2 AND a.Field3 = b.Field3
WHERE 
  b.ID is NULL
Run Code Online (Sandbox Code Playgroud)


Vid*_*lez 5

我测试了两个字段的反连接,差异很明显。

SELECT fields, ..
FROM inputA A
LEFT JOIN inputB B
  ON A.key = B.key AND A.key2 = B.key2
WHERE B.key IS NULL AND B.key2 IS NULL
Run Code Online (Sandbox Code Playgroud)

比其 NOT IN 等效项执行得更好:

SELECT fields, ..
FROM inputA A
WHERE key NOT IN (SELECT NUM_RUT FROM key)
  AND key2 NOT IN (SELECT key2 FROM inputB)
Run Code Online (Sandbox Code Playgroud)

在本例中,读取 4.6Gb 后,BigQuery 中的时间为 5 秒与 7 秒。