0

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

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

列中的值使用表Id中的前缀进行'ID_'格式化Vendor

列中的值使用表VendorId中的前缀进行'VE_'格式化Products

例如 'VE_001245'inProducts指的是'ID_001245'in 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_')
    

编辑。每个表中只有聚集索引(按Id列)。每个表可以包含数百万行。

4

1 回答 1

0

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

于 2013-07-18T17:37:35.757 回答