【问题标题】:Using the same function twice in a query (SQL Server)在查询中使用相同的函数两次(SQL Server)
【发布时间】:2010-01-29 10:23:37
【问题描述】:

在 SQL Server 2005 中,当我编写类似的查询时

SELECT m.*, a.price p1, b.price p2
FROM mytable m
LEFT JOIN products_table_1 a
ON my_hash_function(m.name) = a.hash
LEFT JOIN products_table_2 b
ON my_hash_function(m.name) = b.hash

my_hash_function(m.name) 是计算两次还是只计算一次?如果两次,我该如何使用变量来避免这种情况?

【问题讨论】:

    标签: sql-server-2005 query-optimization


    【解决方案1】:
    select  mm.*, a.price p1, b.price p2 from   
        (SELECT m.*, my_hash_function(m.name) as name
        FROM mytable m) mm
        LEFT JOIN products_table_1 a
        ON mm.name = a.hash
        LEFT JOIN products_table_2 b
        ON mm.name = b.hash
    

    【讨论】:

    • 哦,我明白了。谢谢!不知道会不会执行两次?
    • 我认为这取决于优化器的推理。我不知道,但我想它不会。
    【解决方案2】:

    执行计划显示它确实被执行了两次。但这仅在函数不是确定性 时才成立。为了使函数具有确定性,它必须定义WITH SCHEMABINDING 选项,并且它调用的所有函数也必须是确定性的。在我将哈希函数定义为确定性之后,计划发生了变化。现在它只执行一次!

    但是,如果您不想打扰这些东西,momobo 的解决方案也同样有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多