gpt4 book ai didi

sql - MSSQL 使用 Functions 索引和性能

转载 作者:行者123 更新时间:2023-12-04 18:28:03 24 4
gpt4 key购买 nike

根据我过去的经验,我总是在需要选择数据集的简单情况下使用函数,没有很多复杂的逻辑,而且我还需要传递一个参数。

我最近被告知我应该不惜一切代价避免在 MSSQL 中使用函数,因为它们经常会导致性能问题,有时它们的使用会导致索引无法正确使用。任何人都可以谈谈这一点,并进一步详细解释这是否属实,以及背后的一些推理?

最佳答案

你被天真地建议了。


标量函数

WHERE dbo.fn_get_year(tbl.field) = 2012会混淆tbl.field并使其上的任何索引都无法使用。

您会发现性能更好,例如 WHERE tbl.field >= '20120101' AND tbl.field < '20130101' .

在第一个示例中,必须处理每条记录,因为优化器无法查看函数并推断出哪些记录范围符合条件。

在第二个例子中,你明确表示你想要一个从 a 点到 b 点的连续记录 block 。这使优化器能够使用索引进行范围搜索。


表值函数

所有这些都非常不同于SELECT * FROM dbo.my_function(@parameter) AS data .以这种方式使用表值函数没有任何问题。

将函数的结果连接到另一个表或函数时会很复杂。

如果函数是多语句(有 IF block 等) 那么函数的整个 结果集在处理连接之前返回。

如果该函数是一个内联函数(只有一个RETURNS TABLE AS SELECT blah FROM blah),那么SQL Server 会将其视为一个宏(除非您告诉它不要这样做)。这意味着您的函数代码被替换到您的查询中,并为您的查询构建了一个全新的执行计划。这可能意味着由于索引优化等原因,只会处理您函数中的相关记录。


简而言之,请向建议您的人询问特别他们的建议。如果它仍然是 never use functions忽略它们。

关于sql - MSSQL 使用 Functions 索引和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11865432/

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