Я пытаюсь сделать оператор выбора, который объединяет результаты трех встроенных табличных функций (SQL Server 2005). Первые две функции объединяются следующим образом:
SELECT Client_no
,Portfolio_no
,Sum(Nominal * Price) AS Value
FROM Dbo.Udf_bulkportfolioholdings (@TradeDate) AS Holdings
INNER JOIN Dbo.Udf_bulkpricesecurities (@TradeDate) AS Prices ON Prices.Security_no = Holdings.Security_no
GROUP BY Client_no
,Portfolio_no
Выполнение этого запроса занимает около 0,7 с.
Третья функция запрашивается одна, как показано ниже, и ее запуск занимает 0,006 секунды:
SELECT Currencyid
,Currencycode
,Multiexchangerate
FROM Dbo.Udf_bulkexchangerates(@TradeDateint)
Так что объединение нескольких действительно быстрых запросов должно сделать один быстрый запрос, верно?
SELECT Client_no
,Portfolio_no
,Sum(Nominal * Price * Multiexchangerate) AS Value
FROM Dbo.Udf_bulkportfolioholdings (@TradeDate) AS Holdings
INNER JOIN Dbo.Udf_bulkpricesecurities (@TradeDate) AS Prices ON Prices.Security_no = Holdings.Security_no
INNER JOIN Dbo.Udf_bulkexchangerates(@TradeDateint) AS Fx ON Fx.Currencycode = Prices.Currency
GROUP BY Client_no
,Portfolio_no
Присоедините третью функцию к запросу, и это займет более 40 секунд!
Я дважды проверил поля в соединениях, и они правильные. Я бы подумал / надеялся, что оптимизатор запросов просматривает три функции и сначала получает все три таблицы, а затем соединяет их вместе. Но похоже, что он выполняет третий запрос для каждой возвращаемой записи?
Я попытался сначала вернуть обменные курсы в табличную переменную, и это заняло время выполнения до 9 секунд, но это кажется грязным. Есть ли способ заставить оптимизатор сначала запустить три таблицы, а затем соединиться?
Любая помощь будет принята с благодарностью.