Внутреннее соединение 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 лучше, чем она есть на самом деле.
Ответ 3
Скалярные UDF очень медленные, но встроенные - намного быстрее, обычно так же быстро, как соединения и подзапросы
Кстати, запрос с вызовами функций эквивалентен внешнему соединению, а не внутреннему.
Ответ 4
Чтобы помочь вам больше, просто совет, на SQL-сервере, используя студию Managment, вы можете оценить производительность Display Estimated execution plan
. Он показал, как работают индексы и объединение, и вы можете выбрать лучший способ его использования.
Также вы можете использовать DTA (советник по настройке ядра базы данных) для получения дополнительной информации и оптимизации.