В SQL Server, если ваши функции Inline
, а не Multi-Statement
, SQL Server выделяет tham (подобный макросу) в ваши запросы. Как будто они становятся подзапросами в вашем основном запросе.
Это условно позволяет оптимизатору составить «лучший» план выполнения.
Например; При условии, что поля, к которым вы присоединяетесь, напрямую получены из их исходных таблиц, это должно сделать индексы для этих полей доступными.
Не глядя на весь запрос и ваши отдельные функции, кажется, что вы уже находитесь в хорошем положении в отношении вашего синтаксиса. Следующее место, которое нужно посмотреть, - это существующие индексы, которые нацелены на поиск индекса, а не на сканирование таблицы или сканирование индекса.
(Это все немного упрощенно, но это хорошее начало для оптимизации запросов, что является огромной темой.)
Другой вариант - рассмотреть возможность использования CROSS APPLY
со встроенными табличными функциями.
(Доступно в SQL Server 2005 и далее)
Это позволяет использовать значения из таблиц в ваших запросах в качестве параметров ваших функций. Опять же, при условии, что функции встроены, SQL Server расширяет встроенную функцию при построении плана выполнения.
Примером может быть ...
SELECT
Account.AccountID,
subAccount.AccountID AS SubAccountID,
Balance.currentAvailable AS SubAccountBalance
FROM
Account
CROSS APPLY
dbo.getSubAccounts('User', Account.AccountID) AS SubAccount
CROSS APPLY
dbo.getCurrentBalance(SubAccount.AccountID) AS Balance
WHERE
Account.AccountID = 1234