Присоединение 3 быстрых UDF для создания одного медленного запроса - PullRequest
1 голос
/ 06 апреля 2011

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

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 06 апреля 2011

Ну, на самом деле вы попробуете это: сначала объедините две таблицы, а затем соедините полученную производную таблицу с urate для обменных курсов.Это, вероятно, заставит оптимизатор работать так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...