假设我有Table_A
(~50m行)有一列,比如ColA
,它是INTEGER
类型。我也有Table_B
ColB
(~30m 行),它是VARCHAR
类型,但该列仅由数字 ID 组成(例如,'12345')。假设我想加入这些表,如下所示:
SELECT *
FROM Table_A AS a
INNER JOIN Table_B AS b
ON a.ColA = b.ColB
有人告诉我,使用INTEGER
列JOIN
通常比使用VARCHAR
列更快。但是通读StackOverflow和通过Google找到的其他资源并没有帮助我得出任何关于这个问题的结论(例如,1,2和3)。
我的问题是:
- 在联接这两个表之前,我是否应该将
ColB
的列类型更改为INTEGER
?这会提高联接性能吗? - 假设我决定将
ColA
转换为VARCHAR
,最佳做法是将其宽度/大小限制为尽可能小,还是VARCHAR
列的大小/宽度在 JOIN 性能中很重要? - 哪些工具(除了计算
query_end_time - query_tart_time
)可以帮助我说明SQL Server中的查询性能改进(如果有的话)?
提前感谢您对上述任何问题的回答/建议!
应将数字的字符串表示形式转换为数字。 您的推荐信不合适,原因有两个:
- 他们似乎更专注于MySQL(尽管这并不重要)。
- 他们谈论主键,而不是联接。
我知道没有参考资料会说与不同类型的连接是一个好主意。 在某些情况下可能无关紧要,但您应该确定单个类型,并且数字比字符串更好:
-
数字的大小是固定的。 字符串的大小各不相同。 这给索引和比较操作增加了一点开销。 没什么大不了的,但如果有选择,请坚持使用更好的。
-
数据类型的混合可能会妨碍索引的使用。
- 数据类型的混合需要对每个比较进行转换操作。
- 数字和字符串的优化器统计信息可能无法直接比较(取决于优化器)。
- 如果类型不同,则不能声明外键关系。
所以,坚持相同的类型。 这是最重要的。 整数比字符串好一点,所以使用它。