gpt4 book ai didi

sql - 存储过程 - 功能性能差异

转载 作者:行者123 更新时间:2023-12-04 16:48:52 26 4
gpt4 key购买 nike

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

我真的想不通这到底是怎么回事,我也没有时间做更多的研究。由于某些原因我需要它作为一个函数,但我现在不知道该怎么做。我以为我可以将它创建为一个过程,然后在函数中调用它,但后来我意识到不可能为函数做这件事。

我想在这里听到专家的一些好的意见和建议。提前致谢

ps: 我没有在这里添加任何代码,因为代码格式不正确而且很脏。如果有人感兴趣,我会分享它。服务器是sql 2014 enterprise 64位编辑:我之前看到了可能重复的问题,但它并没有让我满意,因为我的问题专门针对性能影响。另一个问题有很多关于程序和函数之间一般差异的答案。我想更清楚地说明可能与性能相关的差异。

最佳答案

这些是与我的经验的不同之处:

  • 当您第一次开始编写该函数时,您可能会用相同的参数反复运行它,直到它正常工作。这会启用页面缓存,其中 SQL Server 将相关数据保存在内存中。
  • 函数不缓存它们的执行计划。随着您添加更多数据,制定计划所需的时间会更长。 SET STATISTICS TIME ON 查看查询编译时间与执行时间。
  • 函数只能使用表变量,而且没有关于这些的统计信息。这可能会导致以后做出一些可怕的 JOIN 决定。

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

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

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

关于sql - 存储过程 - 功能性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31196217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com