Bigquery“ NOT IN”比较性能太慢

时间:2018-09-28 07:37:49

标签: google-bigquery

“ NOT IN”比较似乎有些变化了吗?与一个月前相比,性能非常差。

我有这样的查询:

SELECT SOMETHING FROM X WHERE KEY NOT IN (SELECT KEY FROM Y)

Y返回45,000个键。

X包含84,000条记录。

此查询需要1分钟以上的时间才能完成,而使用IN比较仅需几秒钟。

实际查询比这要复杂,但是我试图删除复杂的部分,并将其缩小到“ NOT IN”比较的原因。

我早在8月份就使用较大的数据集运行了此查询,但运行速度并不慢。我想知道“ NOT IN”操作是否有任何变化。以及是否有任何解决方法可以提高性能。

Execution Details Screenshot

1 个答案:

答案 0 :(得分:1)

这3个查询的行为应相似(结果相同且性能相似),但是NOT INNOT EXISTS的运行方式现在变慢了。

我创建了一个bug来跟踪这种性能影响,因为它应该只是暂时的(https://issuetracker.google.com/issues/116839201)。

SELECT tags, COUNT(*) c, ANY_VALUE(b.value)
FROM `bigquery-public-data.stackoverflow.posts_questions` a
LEFT JOIN (SELECT x.value FROM UNNEST((
  SELECT APPROX_TOP_COUNT(tags, 10000) 
  FROM `bigquery-public-data.stackoverflow.posts_questions` 
)) x ) b
ON a.tags=b.value
WHERE b.value IS NULL
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1000

12 seconds, fh-bigquery:US.bquijob_3c0fdf82_1661f6f3dd1

SELECT tags, COUNT(*) c
FROM `bigquery-public-data.stackoverflow.posts_questions` 
WHERE tags NOT IN(SELECT x.value FROM UNNEST((
  SELECT APPROX_TOP_COUNT(tags, 10000) 
  FROM `bigquery-public-data.stackoverflow.posts_questions` 
)) x)
GROUP BY 1
ORDER BY 2 DESC, 1
LIMIT 1000

> 400 seconds, fh-bigquery:US.bquijob_766cc8ab_1661f7023bb

SELECT tags, COUNT(*) c
FROM `bigquery-public-data.stackoverflow.posts_questions` 
WHERE NOT EXISTS(SELECT x.value FROM UNNEST((
  SELECT APPROX_TOP_COUNT(tags, 10000) 
  FROM `bigquery-public-data.stackoverflow.posts_questions` 
)) x WHERE tags=value)
GROUP BY 1
ORDER BY 2 DESC, 1
LIMIT 1000

> 400 seconds, fh-bigquery:US.bquijob_59a9d1e6_1661f59db40

一般来说:NOT EXISTSNOT IN更可取,因为它在空值下表现更好。