2011-01-26 5 views
15

У меня есть запрос sql, который я буду использовать в нескольких хранимых процедурах. Запрос работает с несколькими таблицами и возвращает целочисленное значение на основе двух переданных ему переменных.reuse sql с представлением или функцией

Вместо того, чтобы повторять запрос в различных хранимых процедур, я хочу поделиться и есть 2 варианта:

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

Я склонялся к варианту 1, но хотелось бы мнения, на которых лучше и обычной практикой. Какой бы лучше производительность мудрым и т.д. (присоединение к представлению или вызова функции)

EDIT: РСУБД SQL Server

ответ

13

Если вы всегда будете использовать тот же параметризированный предикат, чтобы отфильтровать результаты, я бы пошел на параметризованную встроенную функцию с табличной оценкой. В теории это рассматривается так же, как вид, поскольку они оба раскрываются оптимизатором на практике, что он может избежать проблем с предикатом. Пример такого случая можно увидеть во второй части this article.

Как Андомар отмечает в комментариях большую часть времени оптимизатор запросов делает хорошую работу по преодолению предиката туда, где он необходим, но я не знаю ни одного обстоятельства, при котором использование встроенного TVF будет выполнять хуже, поэтому это кажется разумным выбором по умолчанию между двумя (очень похожими) конструкциями.

Единственным преимуществом, которое я могу видеть в представлении, является то, что он позволит вам выбирать без фильтра или с различными фильтрами, поэтому он более универсален.

Inline TVFs также может использоваться для замены скалярных UDF для повышения эффективности as in this example.

1

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

  • скалярная функция
  • табличное значение функции (встроенный или мульти-заявление)

Если вы возвращались записи, то вы можете использовать ИНЕКЕ извне не слишком сложный VIEW, который может быть вставлен в запрос в представлении, но поскольку все, что вы возвращаете, это один столбец integer value, то представление не будет работать.

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

Однако обычаи разные - скалярная функция возвращает одно значение сразу

select dbo.scalarme(col1, col2), other from .. 

тогда инлайн-ТВФ требует, чтобы вы либо подзапрос его или CROSS ОТНОСИТЬСЯ против другой таблицы

select (select value from dbo.tvf(col1, col2)), other from .. 

-- or 

select f.value, t.other 
from tbl t 
CROSS apply dbo.tvf(col1, col2) f -- or outer apply 
+0

Вид может возвращать результат одной строки в одной строке. По общему признанию, это не обычный случай, но, вероятно, более эффективный, чем скалярные UDF. Изменить - Ах, вы сразу задали вопрос о параметризации. Я предположил, что это будет через предикат на представлении. –

+0

Я могу присоединиться к представлению и ограничить результаты на основе предложения where – amateur

+0

Обычно вы «проходите» в параметрах в представление с предложением where – Andomar

0

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

Я буду придерживаться вашей части «обычной практики».

Итак, скалярное дерево функций кажется мне естественным решением в этом случае. Почему вам нужно только значение, возвращаемое целочисленное значение - для чего нужны скалярные функции, не так ли?

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

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

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

0

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

Смежные вопросы