【问题标题】:Use of scalar functions in Join condition在 Join 条件中使用标量函数
【发布时间】:2018-07-08 04:13:12
【问题描述】:

我正在加入一个表以检索一个值,但为了加入我需要做一些逻辑,因为这两个表都没有一个共同的值。所以逻辑是做一个前 1 并从一个公共表中为两个输入获取一个特定的值。我打算将逻辑放在标量函数中,然后在连接条件中调用它。

我有一个像这样的简单连接

LEFT JOIN <IndexTable> Tbl1 ON Tbl1.PrimaryKey = MainTbl.PrimaryKey

我打算使用用户定义的标量函数将其更改为类似的东西

LEFT JOIN <IndexTable> Tbl1 
ON dbo.fnGetCommonID(Tbl1.PrimaryKey) = dbo.fnGetCommonID(MainTbl.PrimaryKey)

就性能而言,以这种方式使用它好还是有更好的方法。

【问题讨论】:

  • 优化器将无法在带有标量函数的版本中使用连接的ON 条件中的任何索引。第一个版本更可取,假设可以用这种方式表达您的查询。
  • 我可以推荐你发布标量函数吗?可能有人可以帮助有效地实现相同的结果......
  • 在两个表上创建持久计算列并在计算列上连接

标签: sql-server performance join user-defined-functions


【解决方案1】:

如果可能,请在查询中进行计算,可能使用 OUTER APPLY 而不是 LEFT JOIN:

OUTER APPLY (
    SELECT TOP 1 <at least one field, also values from MainTbl may be used>
    FROM <the set of data you need>
    WHERE <boolean, also values from MainTbl may be used>
    ORDER BY <make the top record the one you want>
) AS Tbl1

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 2016-09-29
    • 2023-04-03
    • 2011-11-16
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多