我正在使用SQL Server 2008R2。
我有以下设置:
-- Query #1
SELECT * FROM
Product P
INNER JOIN ProductComments C ON C.ProductId = P.ProductId
-- Query #2
SELECT * FROM
GetAllProducts() P
CROSS APPLY GetCommentsOfProduct(P.ProductId) C
其中GetAllProducts()
是
CREATE FUNCTION GetAllProducts
(
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM Product
)
和GetCommentsOfProduct(P.ProductId)
是
CREATE FUNCTION [dbo].[GetCommentsOfProduct]
(
@ProductId int
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM ProductComments WHERE ProductId = @ProductId
)
查询#1和查询#2都会产生完全相同的实际执行计划并返回相同的结果。他们的查询成本相对于批次都是50%。这是否意味着SQL查询优化器将这些查询转换为同一个查询?为什么调用UDF没有开销?这是否意味着我可以将所有表格构建成UDF,即使在进行JOIN操作时也不会出现性能问题?你知道有任何缺点吗?
答案 0 :(得分:7)
有multiple ways来编写表值函数。您使用AS RETURN
的语法是“内联表值函数”。这相当于一个视图。 SQL Server将在执行语句时扩展该功能。调用这种函数没有任何开销。
“多语句表值函数”不等同于视图。优化器不能"inline"多个语句,因此“多语句TVL”通常会产生很大的开销。
答案 1 :(得分:5)
这是否意味着SQL查询优化器会转换这些查询 进入同一个查询?
是。内联表值函数由优化程序扩展到外部查询中。有点像宏。