У меня есть таблица, которая выглядит что-то вродеЕсть ли способ улучшить производительность этой функции SQL?
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 оптимизирован для основанной на наборе логики, а не для итеративной рекурсии. – JNK
@Purplegoldfish: простой способ повысить производительность - это удалить соединение с '[OpsInstructorEventsView]' из основного запроса, так как вы в настоящее время не используете ни одно из полей из него. –
@MarkBannister Спасибо, я, должно быть, пропустил это, я оставил его, немного поиграв, пытаясь сделать это всего за один проход. – Purplegoldfish