我有一个SQL查询,我将在多个存储过程中重用。该查询针对多个表,并根据传递给它的2个变量返回一个整数值。
我不想在不同的存储过程中重复查询,而是要共享它并有两个选项:
我倾向于选项1但是希望看哪些是更好和更常见的做法。这将是更好的性能明智等(加入视图或调用函数)
编辑:RDBMS是SQL Server
答案 0 :(得分:13)
如果您将始终使用相同的参数化谓词来过滤结果,那么我将使用参数化内联表值函数。从理论上讲,它被视为与View相同,因为它们在实践中都被优化器扩展,可以避免谓词推动问题。这种情况的一个例子可以在this article的第二部分中看到。
正如Andomar在评论中指出的那样,大多数时候查询优化器确实能够很好地将谓词推到需要的位置,但我不知道任何使用内联TVF的情况会更差所以这似乎是两个(非常相似)构造之间的合理默认选择。
我可以看到View的一个优点是,它允许您选择没有过滤器或使用不同的过滤器,因此更加通用。
内联TVF也可用于替换标量UDF以提高效率as in this example。
答案 1 :(得分:1)
您无法将变量传递到视图中,因此您唯一的选择就是使用函数。有两种选择:
如果你要返回记录,那么你可以在一个不太复杂的VIEW之外使用一个WHERE子句,它可以在视图中内嵌到查询中,但是因为你要返回的只是一列{{ 1}},然后视图将无效。
查询优化器可以扩展内联TVF以与外部(调用)查询一起工作,因此与SCALAR函数相比,它在大多数情况下可以更快。
但是,用法不同 - SCALAR函数立即返回单个值
integer value
而内联TVF要求您对其进行子查询或对另一个表进行CROSS APPLY
select dbo.scalarme(col1, col2), other from ..
答案 2 :(得分:0)
我会给你一个半答案,因为我无法确定哪些表现更好,对不起。但是我肯定其他人肯定会得到很好的建议。
我会坚持你的“普通做法”部分。
因此,在这种情况下,标量函数wood似乎是一种自然的解决方案。为什么,你只需要一个值,一个返回的整数值 - 这就是标量函数的用途,不是吗?
但是,如果我能够看到以后我需要多个值的概率,那么我可能会考虑切换到TVF。那么,如果您已经实现了标量函数并在应用程序的许多地方使用它,现在需要使用基本相同的逻辑返回值,列或值表,该怎么办?
在我看来(没有双关语),视图可能会成为标量和表值函数的最大公约数。这些函数只需要应用参数。
现在您已经说过,您只打算选择使用哪个选项。然而,考虑到上述情况,我仍然认为视图可以是一个很好的选择并且在扩展应用程序时证明是有用的,并且您实际上可以同时使用视图和函数(如果只是那样并没有使性能太糟糕),就像我有描述
答案 3 :(得分:0)
TVF对视图的一个优势是,您可以强制任何人调用它来定位特定索引。