小编AJA*_*JAr的帖子

内联表值函数中 SELECT * 的性能

今天,工作中的首席 DBA 说我不应该使用 ITVF 来完全包装视图,但从我的基本基准来看,我对此表示怀疑。看起来 SQL Server 只是在查询时对它实际需要的列进行排序(基于函数的请求)。我这么说是因为我发现下面两个示例的执行时间非常相似。


uf_GetCustomersByCity_A

在此示例中,我创建了一个 ITVF,它执行 a 操作SELECT *,返回一个已过滤的CustomerView

CREATE FUNCTION [dbo].[uf_GetCustomersByCity_A] (@idCity INT)
RETURNS TABLE
AS RETURN

    SELECT CustView.*
      FROM [dbo].[CustomerView] CustView
     WHERE CustView.idCity = @idCity

GO
Run Code Online (Sandbox Code Playgroud)

uf_GetCustomersByCity_B

CREATE FUNCTION [dbo].[uf_GetCustomersByCity_B] (@idCity INT)
RETURNS TABLE
AS RETURN

    SELECT CustView.idCustomer
         , CustView.cFullName
         , CustView.cCityName
         , CustView.fBalance
      FROM [dbo].[CustomerView] CustView
     WHERE CustView.idCity = @idCity

GO
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是否是一个有效的观察结果,或者只是长时间调试的副作用(假设 SQL Server 通过使用进行优化)。在视图中提供所需的所有内容而不是在 ITVF 中专门指定每一列具有很大的价值。

业余基准

因此,两者都工作得很好,在 4-5 秒内产量约为 500k 行(注意:有一些复杂的子句会导致漫长的执行时间,这些示例很难说明这里的目的)。该视图有大约 70 或 80 列,其中许多都是内联格式化或操作的。

-- …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server stored-functions set-returning-functions

0
推荐指数
1
解决办法
2318
查看次数