Какой был бы лучший способ собрать около миллиона записей из БД?

Мне нужно отображать и отображать данные на веб-странице, количество записей которой может варьироваться в зависимости от фильтров от 500 записей до 1 миллиона записей.

Будет ли кеширование использовать здесь, как я думаю, миллион записей в памяти – это не очень хорошая мысль. SqldataReader ?

Конечно, пейджинг – это обязательное условие. Показывать 1 миллион записей – это худший сценарий (глупый All filter in-use!).

Должен ли я использовать подключенную архитектуру (SqlDataReader) или отключенную архитектуру (DataSets)?

Прежде всего, подумайте об этом так: отображение 1 миллиона записей абсолютно не имеет смысла для любого пользователя. Итак, вы должны думать о том, что пользователь ожидает увидеть. Может быть, резюме ?! Возможно, разбивайте страницы на страницах, например, 25 или 50 или 100 записей. Любой из этих подходов не потребует, чтобы вы сохраняли 1 M записей за раз в памяти.

Кроме того, когда вы запускаете запрос к базе данных SQL и используете SqlDataReader, вы не будете получать все записи, но вместо этого драйвер SQL отправит запрос на SQL-сервер, сервер выполнит запрос, подготовит набор результатов и создаст курсор вперед-только на сервере. Затем драйвер будет извлекать запись за раз, каждый раз, когда вы вызываете Read () на вашем SqlDataReader. Поведение очень похоже, если вы используете LINQ to SQL, который использует отложенное выполнение. Результирующий набор не переносится полностью до тех пор, пока (или если) вы не запросите каждую строку.

Таким образом, простой запрос на выбор страницы сделает трюк. Или в других случаях какой-то сводный отчет, который объединяет данные из этих 1 млн записей одной или двух страниц соответствующих данных.

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

В качестве последней заметки, если вы выполняете разбиение на страницы – убедитесь, что метод, используемый для реализации разбивки на страницы, зависит от сервера SQL, отправляющего данные по одной странице за раз, а не чтения всего 1 миллиона записей в ASP.NET, а затем разбивки на страницы копия данных, потому что это было бы очень неэффективно и медленно. Ниже приведен пример запроса SQL Server, который выполняет разбиение на страницы: SO Вопрос № 109232

Я согласен с остальными ответчиками. отображение 1M записей смехотворно. Тем не менее, вы можете отображать первые X-записи и страницы.

Фокус в хранимой процедуре делает выборку

 ALTER PROCEDURE [dbo].[MyHugeTable_GetWithPaging] ( @StartRowIndex int, @MaximumRows int ) AS SET NOCOUNT ON Select RowNum, [UserName] From (Select [ID], [UserName] Row_Number() Over(Order By [ID] Desc) As RowNum From dbo.[MyHugeTable] t) As DerivedTableName Where RowNum Between @StartRowIndex And (@StartRowIndex + @MaximumRows) 

Если ваш сервер не может кэшировать 1 миллион записей, как, по вашему мнению, веб-браузер вашего пользователя будет обрабатывать 1 миллион записей, на которые стоит HTML?

Рассмотрим пейджинг ( вот пример с 1 миллионом записей )

Также учтите, что пользователь никогда не хочет более 30-50 записей. Вы либо показываете им слишком низкий уровень детализации, либо вам нужно больше фильтровать.

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

как это.

 Create proc Test @take smallint, @skip smallint, @orderBy nvarchar(20), @subscriptionid smallint, as DECLARE @SQLQuery AS NVARCHAR(max) SET @SQLQuery=' Select ROW_NUMBER() OVER (ORDER BY P.ProductId desc) as RowNum,* from product" set @[email protected] + ' and Subscriptionid='+CONVERT(nvarchar, @subscriptionid) set @SQLQuery= ';WITH Results_CTE AS ( '[email protected] set @SQLQuery= @SQLQuery +' ) SELECT * FROM Results_CTE WHERE RowNum > '+CONVERT(nvarchar, @skip)+' AND RowNum <= '+CONVERT(nvarchar, @[email protected]) --//paging'; END EXECUTE sp_executesql @SQLQuery 
  • SQL-запрос не работает должным образом
  • Добавление веб-приложения C # на веб-сайт с помощью IIS6
  • Подключение к сайту asp.net
  • Как получить конкретный результат из поиска в столбце SQL, заполненном XML
  • Предотвращение использования пользователями одной и той же строки
  • Выбор строки в gridview, затем передача выбранной строки на другую страницу
  • Отображение нескольких изображений в одной ячейке шаблона данных
  • Как сохранить элементы меню (текст) в динамические состояния сеанса
  • передача динамических значений для каждой строки в списке
  • Вставка строки в таблицу реляционных баз данных
  • Как выполнить текстовый поиск в списке CustomObjects, который содержит слова с ошибками поиска?
  • Interesting Posts
    Давайте будем гением компьютера.