存储过程 - 函数性能差异

时间:2015-07-02 23:27:23

标签: sql sql-server function tsql stored-procedures

我有一个表值函数,里面有很多代码,做多个连接选择和调用子函数并返回一个结果集。在这个函数的开发过程中,在某些时候,我在执行函数时遇到性能下降。通常不应超过1秒,但开始大约需要10秒。我玩了一些连接和索引,但没有任何改变。 经过一段时间的变化和研究后,我希望以另一种方式看待结果。我创建了与存储过程完全相同的精确代码。然后我执行了sp。繁荣!它需要不到1秒。使用函数,相同的精确代码大约需要10秒。

我真的无法弄清楚这一切是什么,我没有时间做更多的研究。由于某些原因我需要它作为一个功能,但我不知道该做什么。我以为我可以创建它作为proc然后在函数内调用它然后我意识到它不可能为函数做。

我想听听专家提出的一些好的意见和建议。 提前谢谢

ps:我没有在这里添加任何代码,因为代码格式不好而且很脏。如果有人有兴趣我会分享。服务器是sql 2014企业64位 编辑:我之前看到了可能重复的问题,但它并不满足我,因为我的问题是关于性能命中。关于程序和功能之间的一般差异,另一个问题有许多答案。我想更清楚地了解可能与性能相关的差异。

1 个答案:

答案 0 :(得分:1)

这些与我的经历有所不同:

  • 当您第一次开始编写该功能时,您可能会再次使用相同的参数运行它。再次,直到它正常工作。这样可以实现SQL Server将相关数据保存在内存中的页面缓存。
  • 功能不会缓存执行计划。当您添加更多数据时,需要更长时间才能制定计划。 SET STATISTICS TIME ON查看查询编译时间与执行时间。
  • 函数只能使用表变量,并且没有统计数据。这可能会在以后做出一些可怕的JOIN决定。

有些人更喜欢表值函数,因为它们更容易查询:

SELECT * FROM fcn_myfunc(...) WHERE <some_conditions>

执行存储过程,然后过滤掉临时表,而不是创建临时表。如果您的代码对性能至关重要,请将其转换为存储过程。