假设您有一个大量使用表变量的多语句表值函数。有哪些方法可以优化它们?我只知道以下这些,但它们都令我失望。
- 将表变量转换为内存优化表变量,并祈祷它会产生很大的变化。鉴于他们没有统计数据,可能不会。
- 到处乱扔
OPTION(RECOMPILE)
,希望有最好的结果。这将为您提供更好的基数估计,但这些都不是灵丹妙药。 - 作弊:删除表变量,将函数转换为内联表值函数,并希望得到最好的结果。
- Cheat:将表变量转换为临时表,将函数转换为存储过程,并祈祷接口的更改不会出现问题。
假设 SQL Server 2019,因为我认为这是该问题中提到的任何内容的性能最后一次改进。
这些不是作弊,而是解决方案。
非内联函数(无论是标量函数还是表值函数)对性能不利,原因有二:
它执行的是 RBAR(逐行执行)。因此,它通常需要为数据集中应用的每一行处理一次。
它在执行计划中围绕执行多语句表值函数的位置创建一个串行区域,这意味着并行性超出了该计划区域的范围。
如果您可以将函数转换为可内联的,那么获得更好结果的几率会明显提高。这并不是真正的“希望最好的情况”。将函数更改为过程也是如此。它为您在查询调优时使用 SQL Server 引擎提供了更多选项。如果对过程的关注是接口的更改,则在某些有限的用例中,您可以将过程包装回函数中,以便对使用者来说它是相同的接口。不过,最好的选择是从一开始就开始使用适当的功能(例如,可能的过程)。
如果为多语句表值函数编写的代码存在性能问题,则几乎可以肯定会重写查询。