Значительно ли снизит производительность использование функции для упрощения SQL-запроса?

#sql #sql-server-2005 #function

#sql #sql-server-2005 #функция

Вопрос:

У меня есть запрос, который использует сложный набор операторов CASE, некоторые вложенные, некоторые с ОБЪЕДИНЕНИЕМ операторов CASE, и управлять им непросто.

Та же базовая логика применима примерно к 12 столбцам в SELECT и может быть модулирована и помещена в функцию — с преимуществами, включающими согласованность и простоту прототипирования.

Приведет ли помещение логики в функцию к значительному снижению производительности? Являются ли функции изначально более медленными?

Выбор извлекается из 5 таблиц, каждая из которых содержит около 100 000 строк, поэтому производительность имеет определенное значение.

SQL Server 2005

Комментарии:

1. почему бы вам не попробовать и не сравнить?

Ответ №1:

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

Если вам нужно выполнить фильтрацию по результату скалярной функции ( WHERE col = dbo.scalar_function() ), часто помогает создать встроенную табличную функцию. Оно вернет свое значение как единственную строку результирующей таблицы. Затем вы бы сделали inner join с результатом функции, эффективно фильтруя по возвращаемому значению. Это работает, потому что SQL Server всегда может развернуть встроенные табличные функции и встроить их в вызывающий запрос.

Обратите внимание, что этот трюк не сработает, если функция является многоступенчатой. Их нельзя отменить.

Комментарии:

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