tsql表值函数最佳实践

tsql表值函数最佳实践,tsql,user-defined-functions,Tsql,User Defined Functions,我在公立学校系统工作,必须为各种事情创建行为报告。我有十几个报告,其中数据是通过存储过程生成的,并且几乎检索相同的基础数据。我想创建一个表值函数,以便每个报表都使用相同的基本数据集 我有一个student表,其中包含诸如学年、年级、学校ID等列。键是enrollmentID。我试图确定哪个更有效,从学生表(学年、年级等)返回我要处理的所有字段,还是只返回键(enrollmentID),然后在调用函数的查询中将其与学生表联接 一方面,在函数和调用函数的存储过程中连接student表似乎是多余的。另

我在公立学校系统工作,必须为各种事情创建行为报告。我有十几个报告,其中数据是通过存储过程生成的,并且几乎检索相同的基础数据。我想创建一个表值函数,以便每个报表都使用相同的基本数据集

我有一个student表,其中包含诸如学年、年级、学校ID等列。键是enrollmentID。我试图确定哪个更有效,从学生表(学年、年级等)返回我要处理的所有字段,还是只返回键(enrollmentID),然后在调用函数的查询中将其与学生表联接

一方面,在函数和调用函数的存储过程中连接student表似乎是多余的。另一方面,数千条记录可能会返回,在过去,如果我试图从一个函数返回大量数据,我似乎注意到了明显的延迟


关于如何最好地使用表值函数,是否有最佳实践?一如既往,非常感谢您的帮助

您可以探索设置索引视图以提供学生数据。它可以比标准视图或特殊查询性能更好一些,因为它利用了索引。这里有一篇文章,我简要地描述了一个:一个内联TVF应该有一个非常小的性能影响。优化器将其视为一个派生表,因此处理起来非常快。唉,你没有提供足够的细节来决定一个更好的解决方案(我认为如果你提供了,那么对于一篇SO文章来说,它将太宽泛了)。如果需要TVF,最好是内联TVF。谢谢@ZoharPeled,我想我一直在使用多语句表函数而不是内联…但是现在我已经阅读了内联…它只能是一个select语句,对吗?例如,我有从表中选择用户选择值的TVF,如果用户没有选择值,则我执行“if@@RowCount=0”返回默认值。我需要做一些创造性的事情,比如联合,将其转换为一个select并使其内联,对吗?是的,只有一个select语句(但允许使用cte)您可以从表中选择或从单个select语句中选择默认值。您可以探索设置索引视图以提供学生数据。它可以比标准视图或特殊查询性能更好一些,因为它利用了索引。这里有一篇文章,我简要地描述了一个:一个内联TVF应该有一个非常小的性能影响。优化器将其视为一个派生表,因此处理起来非常快。唉,你没有提供足够的细节来决定一个更好的解决方案(我认为如果你提供了,那么对于一篇SO文章来说,它将太宽泛了)。如果需要TVF,最好是内联TVF。谢谢@ZoharPeled,我想我一直在使用多语句表函数而不是内联…但是现在我已经阅读了内联…它只能是一个select语句,对吗?例如,我有从表中选择用户选择值的TVF,如果用户没有选择值,则我执行“if@@RowCount=0”返回默认值。我需要做一些创造性的事情,比如联合,将其转换为单个select并使其内联,对吗?是的,只有一个select语句(但允许使用cte),您可以从表中选择,也可以从单个select语句中选择默认值。