Внутреннее соединение Vs скалярная функция

Какой из следующих запросов лучше... Это всего лишь пример, есть множество ситуаций, когда я хочу, чтобы имя пользователя отображалось вместо 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

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

Спасибо

Ответ 1

Хороший вопрос и замечательно думать о производительности SQL и т.д.

С чистой точки зрения SQL лучше. В первом утверждении он может делать все в одной команде с объединением. Во втором случае для каждой строки в trn_misc_email необходимо запустить отдельный BATCH, чтобы получить имя пользователя. Это может вызвать проблемы с производительностью сейчас или в будущем.

Это также eaiser, чтобы читать для кого-либо еще, входящего в проект, поскольку они могут видеть, что происходит. Если у вас есть второй, вы должны пойти и посмотреть в функции (я предполагаю, что это такое), чтобы узнать, что это делает.

Таким образом, на самом деле две причины использовать первую причину.

Ответ 2

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

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

Ответ 4

Чтобы помочь вам больше, просто совет, на SQL-сервере, используя студию Managment, вы можете оценить производительность Display Estimated execution plan. Он показал, как работают индексы и объединение, и вы можете выбрать лучший способ его использования.

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