внутреннее соединение против скалярной функции - PullRequest
11 голосов
/ 01 сентября 2010

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

Спасибо

Ответы [ 4 ]

12 голосов
/ 01 сентября 2010

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

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

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

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

4 голосов
/ 01 сентября 2010

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

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

2 голосов
/ 01 сентября 2010

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

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

1 голос
/ 01 сентября 2010

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

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

...