#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, но это полезный ответ. Я прочитаю информацию о табличных значениях, если смогу найти что-нибудь интересное. Приветствия!