Функции по сравнению с хранимыми процедурами

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

87
задан bluish 7 February 2012 в 09:07
поделиться

8 ответов

Если Вы, вероятно, захотите объединить результат этой части кода с другими таблицами, то, очевидно, табличная функция позволит Вам составлять результаты в единственном операторе SELECT.

Обычно существует иерархия (Представление < телевизионная Функция < Сохраненный Proc). Можно сделать больше в каждом, но способность составить выводы, и для оптимизатора для получения действительно включенных уменьшений как функциональности увеличивается.

Так используют, какой бы ни каждый минимально позволяет Вам выражать свой желаемый результат.

50
ответ дан Damien_The_Unbeliever 24 November 2019 в 07:46
поделиться

Функции должны быть детерминированы, и не могут использоваться для внесения изменений в базу данных, тогда как хранимые процедуры позволяют, Вы, чтобы сделать вставляете и обновляете, и т.д.

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

, Но они определенно полезны для табличных возвратов в очень конкретных случаях.

, Если необходимо проанализировать разграниченный запятой список, для моделирования передачи массива к процедуре, функция может превратить список в таблицу для Вас. Это - обычная практика с SQL-сервером 2005, так как мы еще не можем передать в таблицах хранимым процедурам (мы можем с 2008).

49
ответ дан Eric Z Beard 24 November 2019 в 07:46
поделиться

Из документов :

, Если хранимая процедура соответствует следующим критериям, это - хороший кандидат на то, чтобы быть переписанным как табличная функция:

  • логика является выразимой в единственном операторе SELECT, но является хранимой процедурой, а не представлением, только из-за потребности в параметрах.

  • хранимая процедура не выполняет операции обновления, кроме к табличным переменным.

  • нет никакой потребности в динамических операторах EXECUTE.

  • хранимая процедура возвращает один набор результатов.

  • основная цель хранимой процедуры должна создать промежуточные результаты, которые должны быть загружены во временную таблицу, которая тогда запрашивается в операторе SELECT.

44
ответ дан Christoffer Lette 24 November 2019 в 07:46
поделиться

Если у Вас есть функция, Вы могли бы использовать ее в качестве части Вашего SQL-оператора, например

SELECT function_name(field1) FROM table

Она не прокладывает себе путь для хранимых процедур.

6
ответ дан Ilya Kochetov 24 November 2019 в 07:46
поделиться

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

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

Мои 2 цента

4
ответ дан wcm 24 November 2019 в 07:46
поделиться

Как упомянуто выше, функции являются большим количеством документирования readable/composable/self, но менее производительны в целом и могут быть серьезно менее производительными, если Вы увлекаетесь ими в соединениях такой как

SELECT *
FROM dbo.tvfVeryLargeResultset1(@myVar1) tvf1
INNER JOIN dbo.tvfVeryLargeResultset1(@myVar2) tvf2
    ON (tvf1.JoinId = tvf2.JoinId)

Часто, просто необходимо принять дублирование кода, который мог устранить tvf (по недопустимой стоимости производительности.)

Еще одна точка я еще не видел упомянутый, то, что Вы не можете использовать изменение состояния базы данных временные таблицы в составном tvf. наиболее функционально эквивалентный механизм к временной таблице является негосударственным изменением в табличной переменной памяти, и для больших наборов данных, временная таблица, вероятно, будет более производительной, чем табличная переменная. (Другие альтернативы включают динамические таблицы & общие табличные выражения, но на некотором уровне сложности, они прекращают быть хорошим вариантом IMO.)

4
ответ дан bluish 24 November 2019 в 07:46
поделиться

Я был бы производительность тестировать обоих. Это вероятно, подход SP или полученная таблица были бы значительно быстрее, чем функция и раз так что подход должен использоваться. В целом я избегаю функций becasue, они могут быть пожирателями ресурсов производительности.

1
ответ дан HLGEM 24 November 2019 в 07:46
поделиться

Это зависит:), Если Вы хотите использовать табличный результат в другой процедуре, Вы лучше из использования Функции TableValued. Если результаты для клиента, сохраненный proc обычно является лучшим способом пойти.

1
ответ дан edosoft 24 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: