【问题标题】:Performance gain by converting to INTEGER type in SQL for JOIN?通过在 SQL 中转换为 INTEGER 类型以进行 JOIN 来提高性能?
【发布时间】:2017-05-10 18:03:37
【问题描述】:

假设我有一列 Table_A(约 50m 行),比如 ColA,它是 INTEGER 类型。我也有Table_BColB(约30m 行),它属于VARCHAR 类型,但该列仅包含数字ID(例如,'12345')。假设我想加入这些表格,如下所示:

SELECT *
FROM Table_A AS a
INNER JOIN Table_B AS b
ON a.ColA = b.ColB

有人告诉我,JOIN 使用 INTEGER 列通常比使用 VARCHAR 列更快。但是阅读 StackOverflow 和通过 Google 找到的其他资源并没有帮助我就此问题得出任何结论(例如,123)。

我的问题是:

  1. 在加入这两个表之前,我是否应该ColB 的列类型更改为INTEGER?这会提高连接性能吗?
  2. 假设我决定将ColA 转换为VARCHAR,最好将其宽度/大小限制为尽可能小,还是VARCHAR 列的大小/宽度对JOIN 性能有影响?
  3. 哪些工具(除了计算 query_end_time - query_tart_time)可以帮助我说明 SQL Server 中的查询性能改进(如果有的话)?

非常感谢您对上述任何问题的回答/建议!

【问题讨论】:

  • 我认为您的代码中的转换不会加快速度。当您将 varchar 与整数值进行比较时,SQL 将为您执行相同的隐式转换。您可以对其进行测试,但我敢肯定,如果您更改列类型,它只会产生很大的不同。
  • 在#1 中,您是指更改列数据类型,还是使用convert() 函数?
  • @SqlZim,我的意思是更改列数据类型。我想在 JOIN 语句中使用 convert() 函数会增加成本(如果我错了,请纠正我)?
  • @user1330974 它不会增加成本,但它可能无济于事。这将是隐式转换和显式转换之间的区别。只需摆脱转换就会产生很大的不同,并允许您在不增加开销的情况下充分利用索引和比较。
  • 说明改进的工具将在统计和执行计划中。例如set statistics xml, io, time on;

标签: sql sql-server database-performance


【解决方案1】:

您应该将数字的字符串表示形式转换为数字。您的引用不合适有两个原因:

  1. 它们似乎更侧重于 MySQL(尽管这并不重要)。
  2. 他们谈论的是主键,而不是联接。

我知道没有任何参考资料会说使用不同类型的连接是个好主意。可能在某些情况下它并不重要,但您应该选择单一类型,并且数字比字符串更好:

  • 数字的大小是固定的。字符串大小不一。这给索引和比较操作增加了一点开销。没什么大不了的,但如果您有选择,请坚持使用更好的。

  • 数据类型的混合可能会妨碍索引的使用。

  • 数据类型的混合需要对每次比较进行转换操作。
  • 数字和字符串的优化器统计信息可能无法直接比较(取决于优化器)。
  • 如果类型不同,则不能声明外键关系。

所以,坚持使用相同的类型。这是最重要的。整数略好于字符串,所以使用它。

【讨论】:

  • 感谢您的详细解释!我想问你最后一句话的后续问题:为什么INTEGERVARCHAR略好?如果我固定VARCHAR 列的大小,比如20 字符,那不也具有与INTEGER 相同的性能吗?
  • @user1330974 。 . .可变长度键在索引中的效率有点低,并且 20 字节(或实际上最多 22 字节)大于整数(4 字节)。
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2015-10-07
相关资源
最近更新 更多