【发布时间】:2020-06-14 11:54:06
【问题描述】:
我有一个 SQL 查询,其中当前使用表值函数返回结果集,如下所示:
CREATE FUNCTION [dbo].[fnGetUserTable]
RETURNS @tblUser TABLE (
UserDeviceId BIGINT,
UserDeviceName NVARCHAR(50),
UserName NVARCHAR(50)
)
AS
BEGIN
INSERT INTO @tblUser
Select Device.DeviceId, Device.DeviceName, User.UserName
FROM Device INNER JOIN User ON Device.DeviceId = User.UserDeviceId
RETURN
END
但是,我从函数中过滤返回的结果集,如下所示:
SELECT UserDeviceId, UserDeviceName, UserName
FROM [dbo].[fnGetUserTable]
WHERE UserName ='myuser@users.com'
假设表 User 中有 1000,000 条记录,从性能方面来说,最好的做法是按照前面的示例过滤函数返回的结果集, 或将 where 条件直接添加到 [dbo].[fnGetGoldRateTable] 函数内的 SQL 查询中,如下所示:
CREATE FUNCTION [dbo].[fnGetUserTable]
RETURNS @tblUser TABLE (
UserDeviceId BIGINT,
UserDeviceName NVARCHAR(50),
UserName NVARCHAR(50)
)
AS
BEGIN
INSERT INTO @tblUser
Select Device.DeviceId, Device.DeviceName, User.UserName
FROM Device INNER JOIN User ON Device.DeviceId = User.UserDeviceId
WHERE UserName ='myuser@users.com'
RETURN
END
或者它是否会产生相同的性能影响,因为 SQL Server 在 Select 查询中在 Where 子句之前处理 From 子句,这意味着从函数查询返回的结果集将由 SQL Server 插入到 Temp 表中然后过滤根据添加的 where 条件,如果在函数本身中添加 Where 条件,会导致相同的性能标准??
请指教,
提前致谢,
【问题讨论】:
-
为什么这是一个函数而不是一个视图?
-
@David Browne - Microsoft,基本上我将参数传递给它,例如“@LangId”,因此查询应返回本地化值,这就是为什么它是一个函数,这只是一个示例代码,因为原始查询加入3个表并基本返回结果
-
你比较过这两个选项的查询计划吗?
标签: sql-server performance user-defined-functions