背景。我正在使用SQL Server。我在数据库中有两个表:
Vendors(Id, Name, Description)
Products(Id, VendorId, Name, Description)
Id
列中的值使用'ID_'
表中的前缀Vendor
进行格式化。
VendorId
列中的值使用'VE_'
表中的前缀Products
进行格式化。
例如。 'VE_001245'
中的Products
指的是'ID_001245'
中的Vendors
。
(请不要提议改变这个概念,不关心数据库方案,不建议添加外键。所有这些只是为了说明。)
问题:以下哪个查询在性能上下文中最佳,为什么?
replace
中使用select
函数:
select v.* from Vendors v
inner join
(
select distinct replace(VendorId, 'VE_', 'ID_') as Id
from Products
) list
on v.Id = list.Id
replace
语句中使用on
函数:
select v.* from Vendors v
inner join
(
select distinct VendorId as Id
from Products
) list
on v.Id = replace(list.Id, 'VE_', 'ID_')
编辑。每个表中只有聚集索引(通过Id
列)。每个表可以包含数百万行。
两个查询在性能方面几乎相同。在第一个查询中,排序完成两次,一次是在选择不同的记录时,再次是在执行内部连接时,最后是合并连接,用于选择最终结果集。而在第二次查询排序中只进行一次,但正在执行哈希联接,这比合并连接更昂贵。因此,当您在表上没有任何索引时,两个查询在性能方面都是相同的。