今天,工作中的首席 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_BCREATE 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)