TSQL:在select with join中使用replace函数

时间:2013-07-18 16:42:33

标签: sql sql-server tsql select

背景。我正在使用SQL Server。我在数据库中有两个表:

Vendors(Id, Name, Description)
Products(Id, VendorId, Name, Description)

Id列中的值的格式为'ID_'表中的前缀Vendor

VendorId列中的值的格式为'VE_'表中的前缀Products

'VE_001245'中的

例如 Products引用'ID_001245'中的Vendors

(请不要提议改变这个概念,不要关心数据库方案,不要建议添加外键。所有这些只是为了说明。)

问题:以下哪个查询在性能上下文中最佳?为什么?

  1. 在内部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
    
  2. 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_')
    
  3. 编辑。每个表中只有聚集索引(Id列)。每个表可以包含数百万行。

1 个答案:

答案 0 :(得分:0)

两个查询在性能方面几乎相同。在第一个查询中,排序完成两次,一次是在选择不同的记录时,再次是在执行内部联接时,最后是合并连接选择最终结果集。 而在第二次查询排序只进行一次,但正在执行哈希联接,这比合并连接更昂贵。 因此,当表中没有任何索引时,两个查询在性能方面都是相同的。