Существуют ли присущие SQL-серверу 2008 функции со встроенными табличными функциями, которые не возникают, если SQL-код встроен напрямую? Наше приложение очень активно использует функции со встроенными табличными значениями для повторного использования общих запросов, но недавно мы обнаружили, что запросы выполняются намного быстрее, если мы их не используем.
Учтите это:
CREATE FUNCTION dbo.fn_InnerQuery (@asOfDate DATETIME)
RETURNS TABLE
AS
RETURN
(
SELECT ... -- common, complicated query here
)
Теперь, когда я сделаю это:
SELECT TOP 10 Amount FROM dbo.fn_InnerQuery(dbo.Date(2009,1,1)) ORDER BY Amount DESC
Запрос возвращается с результатами примерно через 15 секунд.
Однако, когда я делаю это:
SELECT TOP 10 Amount FROM
(
SELECT ... -- inline the common, complicated query here
) inline
ORDER BY Amount DESC
Запрос возвращается менее чем за 1 секунду.
Я немного сбит с толку из-за накладных расходов на использование табличной функции в этом случае. Я этого не ожидал. У нас есть тонна табличных функций в нашем приложении, поэтому мне интересно, есть ли здесь что-то, чего мне не хватает.