Передача данных в Linq to sql против прямой sql - какая из них лучше? - PullRequest
0 голосов
/ 27 июля 2011

Немного теоретического вопроса здесь.

Я создал интерфейс поиска в базе данных для веб-сайта ASP.NET.Я использую linq to sql для операций BL.Я искал разные способы реализации эффективного пейджинга и думаю, что сейчас у меня есть лучший метод, но я не уверен, насколько велика разница в производительности, и мне было интересно, есть ли у каких-либо экспертов какие-либо объяснения / советы, которые можно дать?

МЕТОД 1: Традиционный метод, который я видел во многих руководствах, использует чистый linq to sql и, похоже, создает один метод для получения данных.И затем один метод, который возвращает счетчик на пейджер.Я предполагаю, что это можно сгруппировать в одном методе, но, по сути, в результате получается, что создается IQueryable, который содержит данные для всего запроса, а затем выполняются IQueryable.Count () и IQueryable.Skip (). Take ().

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

МЕТОД 2: вызов хранимой процедуры из BL.В SP предложение WHERE собирается в соответствии с полями, указанными пользователем, и создается динамический запрос.Результаты динамического запроса вставляются в табличную переменную с временным ключом идентификации, для которого я выполняю COUNT (*) и SELECT WHERE (temp_ID> = x и temp_ID

Это выглядит мнекак эти два метода в принципе выполняют одни и те же операции ...

Мне было интересно, действительно ли метод 2 более эффективен, чем метод 1 (независимо от того, что полный текст не доступен в linq to sql ...).И почему?И на сколько?В моем понимании, SP требует, чтобы запрос был сгенерирован только один раз, так что это должно быть более эффективным.Но какие еще преимущества есть?

Существуют ли другие способы эффективной подкачки?

1 Ответ

0 голосов
/ 04 августа 2011

Я наконец-то нашел время для некоторых ограниченных тестов по этому вопросу. Я проверил это только в базе данных с 500 записями, потому что это то, что я должен передать до сих пор.

В одном случае я использовал динамический SQL-запрос с

SELECT *, ROW_COUNT() OVER(...) AS RN ... FROM ... WHERE RN BETWEEN @PageSize * @PageCount AND @PageSize * (@PageCount + 1)

в другом я использую точно такой же запрос, но без предложения ROW_COUNT () AND WHERE ... и делаю

db.StoredProcedure.ToList().Skip(PageSize * PageCount).Take(PageSize);

в методе.

Я попытался вернуть наборы данных из 10 и 100 элементов, и, насколько я могу судить, разница во времени, которую он занимает, незначительна: 0,90 с для хранимой процедуры, 0,89 с для хранимой процедуры.

Я также попытался добавить методы подсчета, как если бы вы хотели создать пейджер. В хранимой процедуре это, кажется, добавляет очень незначительные накладные расходы (от 0,89 до 0,92 с) от выполнения второго выбора для полного набора результатов. Это, вероятно, увеличится с размером набора данных.

Я добавил второй вызов к запросу Linq to SQL с .Count () на нем, как вы бы сделали, если бы вы использовали, если бы два метода требовали подкачки ASP.NET, и это, похоже, не влияло на скорость выполнения на всех.

Эти тесты, вероятно, не очень значимы, учитывая небольшой объем данных, но с такими наборами данных я сейчас работаю. Вы, вероятно, ожидаете снижения производительности в Linq to SQL, поскольку наборы данных для оценки становятся больше ...

...