Относительная эффективность JOIN против APPLY в Microsoft SQL Server 2008 - PullRequest
2 голосов
/ 24 марта 2009

Мы только начинаем рассматривать переход на SQL 2008 с SQL 2000 и отмечаем новый синтаксис CROSS APPLY и INNER APPLY, который допускает форму «объединения» с параметризованными пользовательскими функциями с табличными значениями или коррелированными подзапросами.

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

Я немного огляделся в сети, но не могу найти какие-либо показатели производительности, которые бы указывали, какой удар по производительности вы бы получили, используя запросы на основе APPLY, по сравнению с тем, что вы могли бы получить, если бы вы указали то же самое. запрос.

Я знаю, что точные воздействия будут сильно зависеть от конкретной схемы и запросов, но мне было любопытно, есть ли у кого-нибудь опыт настройки реальных систем, чтобы поделиться этим.

1 Ответ

4 голосов
/ 24 марта 2009

Я использую APPLY местами. Полезно принудительно обрабатывать строки за строкой вместо цикла, если вам нужно это сделать.

Как ни странно, в одном месте это было бы более эффективно (при использовании профилировщика для просмотра чтений), потому что оптимизатор рассматривал UDF как черный ящик и применял фильтр так, как я хотел.

udf - это встроенная табличная функция, которая при расширении / развертывании в JOIN оказалась хуже, потому что optmiser посмотрел на запрос в целом и применил фильтр в другом месте.

В противном случае, я использую его экономно или в коде, который не часто запускается ... и проверяю, что это не убивает очень плохо. Я принимаю удар, чтобы получить ремонтопригодность.

Не по теме: инкапсуляция идет только в базах данных: в какой-то момент вы теряете преимущество, основанное на множестве.

...