【问题标题】:TSQL: Using replace function in select with joinTSQL:在带有连接的选择中使用替换功能
【发布时间】:2013-07-17 18:02:49
【问题描述】:

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

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

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

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

例如Products中的'VE_001245'指的是Vendors中的'ID_001245'

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

问题:以下哪个查询在性能方面最好?为什么?

  1. 在内部select中使用replace函数:

    select v.* from Vendors v
    inner join
    (
        select distinct replace(VendorId, 'VE_', 'ID_') as Id
        from Products
    ) list
    on v.Id = list.Id
    
  2. on-statement 中使用replace 函数:

    select v.* from Vendors v
    inner join
    (
        select distinct VendorId as Id
        from Products
    ) list
    on v.Id = replace(list.Id, 'VE_', 'ID_')
    

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

【问题讨论】:

  • 我的猜测是 2,就像 1) 我必须在整个产品列表上运行该函数,然后选择与之不同的。对于第二个,我只在不同的列表上运行该函数(即我必须运行替换的行数应该更小)。但是很难知道,不知道数据编号是什么,索引等等。既然您可以访问架构,为什么不同时运行两个显示并比较结果的实际执行计划?
  • 可以加computed columns (SQL2005+) 吗?
  • @BogdanSahlean:不,我不能修改数据库方案。
  • @dash 我已经更新了有关索引和估计表大小的详细信息的问题。目前表格未填满。所以我担心填表时实际执行计划会发生变化。

标签: sql sql-server tsql select


【解决方案1】:

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

【讨论】:

  • 每个表中只有聚集索引(按Id列)。
  • 在这种情况下,您可以选择查询的数量。第一个查询使用嵌套循环连接,在数据较少的情况下很好,第二个查询使用合并连接,适用于大量数据。
猜你喜欢
  • 2017-06-23
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2018-10-31
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
相关资源
最近更新 更多