基于列数据类型的表连接对性能的影响

Posted

技术标签:

【中文标题】基于列数据类型的表连接对性能的影响【英文标题】:Performance impact of table join base on column data type 【发布时间】:2019-10-09 21:28:32 【问题描述】:

我想确保不会对基于 BigQuery 架构设计的查询性能产生负面影响。我有两个需要执行连接的表。我将用于连接表的列可以是 INTEGER 或 STRING 类型。在我的情况下,STRING 会更容易,因为它不需要在我们的代码库中进行任何新的验证来确保所有值都是 INTEGER 类型。但我不想加入 STRING 类型,如果查询性能比在 INTEGER 类型列上运行联接要差得多。

当连接类型为 STRING 与类型为 INTEGER 时,BigQuery 的性能是否存在很大差异?

---更新 10/16---

我对此进行了一些基本分析,结果如下:

使用公共数据集,users 表有 10M 行,posts 表有 31M 行

加入整数:2.78 sec elapsed, 318.1 MB processed (avg over 10 runs)

加入字符串6.77 sec elapsed, 137 MB processed (avg over 10 runs)

-- 加入整数查询

SELECT count(*)
FROM `bigquery-public-data.***.users` u
JOIN `bigquery-public-data.***.***_posts` p
  on u.id = p.owner_user_id
WHERE RAND() < 2

(添加Where子句以避免缓存)

-- 加入字符串

SELECT count(*)
FROM 'bigquery-public-data.***.users' u
JOIN 'bigquery-public-data.***.***_posts' p
  on u.display_name = p.owner_display_name
WHERE RAND() < 2

(添加Where子句以避免缓存)


令人惊讶的是,STRING 上的 JOIN 性能似乎比 INTEGER 差。

【问题讨论】:

【参考方案1】:

不,您不会看到任何显着差异。使用对您的用例更自然的架构。

【讨论】:

嘿 Lak,您是否认为我上面的更新分析有任何缺陷? 有 1100 万个不同的 user_id 但只有 800 万个不同的 display_name,所以你的两个查询不一样。

以上是关于基于列数据类型的表连接对性能的影响的主要内容,如果未能解决你的问题,请参考以下文章

只能对具有兼容列类型 Spark 数据框的表执行联合

对于表列数据类型选择的一点思考

只能对具有兼容列类型的表执行联合

连接来自不同数据库的表的性能影响

mysql数据类型

MySQL015--简述mysql中索引类型有哪些,以及对数据库的性能的影响