Функции SQL Server 2008, которые возвращают таблицы, оптимизируются как хранимые процедуры? - PullRequest
2 голосов
/ 18 января 2011

Будучи учеником ADO.NET в течение многих (многих, многих) лет, я наконец пытаюсь понять Linq. В Linq табличные данные, возвращаемые функцией SQL Server, имеют тип IQueryable, тогда как данные, возвращаемые хранимой процедурой, являются ISingleResult.

Поскольку с IQueryable легче справиться, я бы хотел использовать это. Мой вопрос: функция SQL, которая возвращает данные таблицы так же эффективна, как эквивалентная хранимая процедура?

Ответы [ 3 ]

2 голосов
/ 18 января 2011
My question: is an SQL function that returns table data as efficient as an equivalent stored procedure?

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

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

create function dbo.testif() returns table as return
select * from information_schema.columns

и запрос

select * from dbo.testif() where TABLE_NAME like 'S%'

Условие TABLE_NAME наподобие 'S%' фактически введено в запрос внутри функции, которую выневозможно сделать с помощью хранимой процедуры.

1 голос
/ 20 января 2011

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

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

1 голос
/ 18 января 2011

LINQ-to-SQL очень эффективен для простых запросов, но при выполнении более сложных операторов вы создаете скомпилированный запрос для повторного использования и повышения производительности.

Проверьте класс System.Data.Linq.CompiledQuery.

Ссылка ниже содержит некоторые тесты производительности и дальнейшее обсуждение: http://www.codeproject.com/KB/linq/LINQquery.aspx

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