внутреннее соединение против скалярной функции

Какой из следующих запросов лучше ... Это всего лишь пример, существует множество ситуаций, когда я хочу, чтобы имя пользователя отображалось вместо UserID

Select  EmailDate, B.EmployeeName as [UserName], EmailSubject
    from Trn_Misc_Email as A
         inner join 
         Mst_Users as B on A.CreatedUserID = B.EmployeeLoginName

или

Select  EmailDate, GetUserName(CreatedUserID) as [UserName], EmailSubject
    from Trn_Misc_Email

Если нет преимущества в производительности при использовании первого, я бы предпочел использовать второй ... У меня было бы около 2000 записей в таблице пользователей и 100k записей в таблице электронной почты ...

Спасибо

11
задан sujith karivelil 6 November 2017 в 10:17
поделиться

3 ответа

Встроенный SQL JOIN обычно лучше, чем скалярный UDF, поскольку его можно лучше оптимизировать.

При тестировании обязательно используйте SQL Profiler для просмотра стоимости обеих версий. SET STATISTICS IO ON не сообщает о стоимости скалярных UDF в своих цифрах, из-за чего скалярная версия UDF выглядит лучше, чем она есть на самом деле.

4
ответ дан 3 December 2019 в 05:56
поделиться

Скалярные пользовательские функции очень медленные, но встроенные намного быстрее, как правило так быстро, как соединения и подзапросы

Кстати, ваш запрос с вызовами функций эквивалентен внешнему соединению, а не внутреннему.

2
ответ дан 3 December 2019 в 05:56
поделиться

Чтобы помочь вам больше, просто подсказка, в SQL Server с помощью студии управления вы можете оценить производительность, Отобразить предполагаемый план выполнения. Он показал, как работают индексы и объединение, и вы можете выбрать лучший способ их использования.

Также вы можете использовать DTA (советник по настройке ядра базы данных) для получения дополнительной информации и оптимизации.

1
ответ дан 3 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: