【发布时间】:2012-02-11 12:59:38
【问题描述】:
我有一张看起来像这样的桌子
Event ID Date Instructor
1 1/1/2000 Person 1
1 1/1/2000 Person 2
现在我要做的是返回这些数据,以便每个事件都在一行中,并且讲师都在一列中,并使用<br> 标签(如'Person 1 <br> Person 2')进行拆分
目前我这样做的方式是使用函数
CREATE FUNCTION fnReturnInstructorNamesAsHTML
(
@EventID INT
)
RETURNS VARCHAR(max)
BEGIN
DECLARE @Result VARCHAR(MAX)
SELECT
@result = coalesce(@result + '<br>', '') + inst.InstructorName
FROM
[OpsInstructorEventsView] inst
WHERE
inst.EventID = @EventID
RETURN @result
END
然后我的主存储过程调用它像
SELECT
ev.[BGcolour],
ev.[Event] AS name,
ev.[eventid] AS ID,
ev.[eventstart],
ev.[CourseType],
ev.[Type],
ev.[OtherType],
ev.[OtherTypeDesc],
ev.[eventend],
ev.[CourseNo],
ev.[Confirmed],
ev.[Cancelled],
ev.[DeviceID] AS resource_id,
ev.Crew,
ev.CompanyName ,
ev.Notes,
dbo.fnReturnInstructorNamesAsHTML(ev.EventID) as Names
FROM
[OpsSimEventsView] ev
JOIN
[OpsInstructorEventsView] inst
ON
ev.EventID = inst.EventID
这非常慢,我每次调用数据库需要 4 秒。有没有办法让我提高功能的性能?它是一个相当小的函数,所以我不确定我可以在这里做什么,而且我看不到将 COALESCE 工作到主过程的 SELECT 中的方法。
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
字符串连接(以及一般的字符串函数)并不是 SQL 能够很快完成的事情。 SQL 针对基于集合的逻辑进行了优化,而不是迭代递归。
-
@Purplegoldfish:提高性能的一种简单方法是从主查询中删除与
[OpsInstructorEventsView]的连接,因为您当前没有使用其中的任何字段。 -
@MarkBannister 谢谢,我一定错过了,我在玩了一段时间后试图在一个 proc 中完成所有这些操作
标签: sql performance stored-procedures user-defined-functions