【发布时间】:2017-05-10 18:03:37
【问题描述】:
假设我有一列 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
有人告诉我,JOIN 使用 INTEGER 列通常比使用 VARCHAR 列更快。但是阅读 StackOverflow 和通过 Google 找到的其他资源并没有帮助我就此问题得出任何结论(例如,1、2 和 3)。
我的问题是:
- 在加入这两个表之前,我是否应该将
ColB的列类型更改为INTEGER?这会提高连接性能吗? - 假设我决定将
ColA转换为VARCHAR,最好将其宽度/大小限制为尽可能小,还是VARCHAR列的大小/宽度对JOIN 性能有影响? - 哪些工具(除了计算
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