第一部分
两个表字段类型一样时:
LOGISTICS:

LOGISTICS_SON:

此时进行两个表的inner join
SELECT * FROM LOGISTICS l
inner join LOGISTICS_SON s on s.transorder=l.transorder

第二部分
现在将LOGISTICS表的transorder改成varchar类型:

再执行查询:

这是一个性能的损耗。
但是呢,利用它的这个“特性”,可以做点鸡贼的事(虽然一般用不上,看你的数据库是不是自作聪明地将原本应该“哈希匹配”的,做成了“嵌套循环”了)。
比如当两个表的数据类型相同的时候(如第一部分)
使用这种强制改变执行计划的语句,会报错:

然而,利用字段类型不同,sql server会执行“计算标量”的特性(此时数据表改回第二部分):

此时能够执行成功,原因是在hash join之前,列已经是“计算标量”了。
注意,此时必须是 l.transorder='XXX' ,而不能是 s.transorder='XXX' 。
网友评论