Какой из следующих запросов лучше ... Это всего лишь пример, существует множество ситуаций, когда я хочу, чтобы имя пользователя отображалось вместо 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 записей в таблице электронной почты ...
Спасибо
Встроенный SQL JOIN
обычно лучше, чем скалярный UDF, поскольку его можно лучше оптимизировать.
При тестировании обязательно используйте SQL Profiler для просмотра стоимости обеих версий. SET STATISTICS IO ON
не сообщает о стоимости скалярных UDF в своих цифрах, из-за чего скалярная версия UDF выглядит лучше, чем она есть на самом деле.
Скалярные пользовательские функции очень медленные, но встроенные намного быстрее, как правило так быстро, как соединения и подзапросы
Кстати, ваш запрос с вызовами функций эквивалентен внешнему соединению, а не внутреннему.
Чтобы помочь вам больше, просто подсказка, в SQL Server с помощью студии управления вы можете оценить производительность, Отобразить предполагаемый план выполнения
. Он показал, как работают индексы и объединение, и вы можете выбрать лучший способ их использования.
Также вы можете использовать DTA (советник по настройке ядра базы данных) для получения дополнительной информации и оптимизации.