【发布时间】:2016-08-20 15:40:15
【问题描述】:
我有以下选择查询,它使用标量函数来获取全名。我想通过使用变量来消除冗余,但到目前为止还没有成功。我的查询是
select
a.Id,
a.UserName,
getFullName(a.UserName),
a.CreateTime
from DataTable;
我不想检索“a.User”两次。如果我可以将 a.User 保存在一个变量中,然后将其传递给函数从而提高效率,我会更喜欢。
目前我想出的工作如下
select
Id,
UserName,
getFullName(UserName),
CreateTime
from (select a.Id, a.UserName, a.CreateTime from DataTable) temp
这解决了性能问题,但增加了两次写入相同选择的开销。任何其他建议都会很棒。
DataTable 是这样的
+----+----------+------------+
| Id | UserName | CreateTime |
+----+----------+------------+
| 1 | ab | 10:00 |
| 2 | cd | 11:00 |
| 3 | ef | 12:00 |
+----+----------+------------+
这是用于获取全名的 NamesTable
+----------+----------+
| UserName | FullName |
+----------+----------+
| ab | Aa BB |
| cd | Cc Dd |
| ef | Ee Ff |
+----------+----------+
这是获取全名的函数
Create function [dbo].[getFullName](@user varchar(150)) returns varchar(500)
as
begin
declare @Result varchar(500);
select @Result = FullName from dbo.NamesTable where UserName = @user;
return @Result;
end;
【问题讨论】:
-
这里真正的性能问题是标量函数的存在。他们是出了名的表现不佳。然后,当您将其粘贴在列中时,情况会变得更糟。也许我们可以帮助您创建一个内联表值函数。它将更加灵活,性能更好。我们只需要一些关于它的作用和它使用的表结构的细节。 spaghettidba.com/2015/04/24/…
-
嗯? “解决方法”与原始查询有何不同?
-
@GordonLinoff 在前面的查询中,数据列被重复选择,但在后面的查询中,它是对投影数据的选择,因此速度更快。
-
@fredzyadi 你有没有测量它更快,或者你只是假设它是因为似乎少了一个操作?您是否发现仅在一个表达式中选择字段与在两个表达式中选择字段之间存在显着的性能差异?
-
@DStanley 我已经检查了我的完整查询。一用二用,一用操作。第一个每次要多花费 3 秒,大约需要 3000 行来获取。我有很多 XPath 操作。可能是标量函数与列作为参数一起导致延迟。但肯定存在性能问题。
标签: sql sql-server select subquery