【发布时间】:2023-04-09 04:31:02
【问题描述】:
我使用的是 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 操作时也不会出现性能问题?你知道有什么缺点吗?
【问题讨论】:
-
估计的还是实际的执行计划?您应该为此使用
VIEWs... -
“你知道有什么缺点吗?”——别在意,优点是什么??
-
@AakashM 这与这个问题无关,因为我只是询问 SQL 服务器在这种情况下的技术行为。
-
实际执行计划使用成本估算,而不是实际成本。请记住这一点!!!
-
@AndriyM - 实际计划将显示实际行数和运算符,但成本金额仍基于估计值。您可以使用
SET STATISTICS IO ON来查看实际的页面读取等等。
标签: sql sql-server user-defined-functions