Thi*_*rry 0 sql optimization join user-defined-functions
我正在尝试优化数据库中的查询。该查询类似于以下内容:
select * from Account
inner join udf_Account('user') udfAccount
on Account.Id = udfAccount.AccountId
Run Code Online (Sandbox Code Playgroud)
实际上,真正的查询要长得多,但最重要的一点是它包含一些取决于用户 ID 的用户定义函数 (udf) 的内部联接。(所以这是常量参数,在查询评估期间不会改变)。
由于数据量很大,我的查询在生产数据库上大约需要 20 秒,这是不可接受的。
我已经看到,通过将函数的结果存储在临时表中并在查询中使用这些表可以大大减少查询的持续时间。
我问以下问题:
我可以避免使用临时表吗?这不是告诉 sql 该函数只能计算一次的方法吗?使用临时表意味着我的代码会发生一些重要的变化,这就是为什么如果我有另一个解决方案我会很高兴。
还有其他方法可以优化我的查询吗?
在 SQL Server 中,如果您的函数不是Inline,Multi-StatementSQL Server 会将 tham (类似宏)扩展到您的查询中。就像它们成为主查询中的子查询一样。
理论上,这允许优化器制定“更好”的执行计划。
例如; 如果您要加入的字段是直接从其源表派生的,则这应该使这些字段上的索引可用。
在不查看整个查询和各个函数的情况下,您的语法似乎已经处于良好的位置。下一个要查看的地方是存在的索引,其目标是索引查找而不是表扫描或索引扫描。
(这有点简单,但它是查询优化的良好开端,这是一个巨大的主题。)
另一种选择是考虑CROSS APPLY与内联表值函数一起使用。
(在 SQL Server 2005 及更高版本中可用)
这允许将查询中表中的值用作函数的参数。同样,如果函数是内联的,SQL Server 在构建执行计划时会内联扩展函数。
一个例子可能是......
SELECT
Account.AccountID,
subAccount.AccountID AS SubAccountID,
Balance.currentAvailable AS SubAccountBalance
FROM
Account
CROSS APPLY
dbo.getSubAccounts('User', Account.AccountID) AS SubAccount
CROSS APPLY
dbo.getCurrentBalance(SubAccount.AccountID) AS Balance
WHERE
Account.AccountID = 1234
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11119 次 |
| 最近记录: |