Встроенная табличная функция против хранимой процедуры (SQL Server) - PullRequest
0 голосов
/ 19 июня 2011

Я немного озадачен тем, что лучше использовать в следующем случае: у меня довольно сложный запрос, который используется для составления отчетов.Упрощенная версия выглядит как

  SELECT [type], COUNT(*) as total_num, COUNT(DISTINCT user_id) as uq_user_num
  FROM table1
  INNER JOIN table2 ON (...)
  ...
  WHERE table3.last_action_date BETWEEN :start_date AND :end_date
  GROUP BY [type]

Я могу создать встроенную функцию или хранимую процедуру, которая принимает start_date и end_parameters и выполняет этот запрос.
Я склоняюсь к функции, потому что эта задача не связана с изменением данныхили сложная логика.Кроме того, я могу захотеть использовать результат в APPLY позже (на данный момент это не очень важно).
Имеет ли смысл использовать функцию, а не процедуру?Есть ли разница с точки зрения производительности (кэширование плана выполнения и т. Д.)?

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 июня 2014

Использование табличной функции с несколькими утверждениями аналогично использованию процедуры из кэширования плана и перспективы повторного использования кэшированного плана. Использование встроенной табличной функции аналогично использованию представления из кэша плана и перспективы повторного использования плана (только повторное использование)произойдет точно такое же утверждение, т. е. те же параметры)Учитывая то же самое, вы должны использовать табличную функцию с несколькими утверждениями.

0 голосов
/ 19 июня 2011

Вы также можете рассмотреть возможность использования View. Представление является эффективным, если результаты не изменяются с учетом предоставленных параметров, что у вас есть здесь. В этом случае результаты не изменятся, если вы сделаете два звонка с одинаковой датой начала и окончания.

Однако, два основных различия между хранимым процессом и функцией заключаются в том, что вы не можете вызывать обновления / вставки из функции, и вы не можете вызывать хранимый процесс как часть оператора выбора, но вы можете сделать это с помощью функции.

См. Эту тему для получения дополнительной информации:

Функция против хранимой процедуры в SQL Server

...