Самый быстрый способ загрузки больших таблиц SQL

#c# #sql #asp.net-mvc

#c# #sql #asp.net-mvc

Вопрос:

Я делаю ASP.NET веб-сайт, который отображает данные для пользователя. Он запрашивает базу данных sql для получения этих данных, а затем отображает их в браузере. Таблицы часто содержат более 1 миллиона строк и требуют некоторого времени для загрузки. Вместо того, чтобы пользователю приходилось так долго ждать просмотра страницы, я бы хотел, чтобы страница загружалась, а затем данные добавлялись на страницу по мере ее загрузки. Я могу добиться этого с помощью SignalR, но мой вопрос:

Есть ли в C # способ сказать «select * from tableName», но чтобы он возвращал строки одну за другой, и это самый быстрый способ загрузки данных?

Комментарии:

1. Я не знаю, обеспечивает ли entity framework построчную загрузку данных, но загрузка более 1 миллиона строк в браузере — это довольно большая нагрузка на память. Мой подход к этому заключался бы в том, чтобы сначала предоставить пользователю подкачку, скажем, 10 или 20 записей. Затем, перейдя на следующую или предыдущую страницу, вы можете отфильтровать следующий набор записей. Таким образом, пользовательский интерфейс не будет мешать, и вам не нужно будет загружать все данные сразу.

Ответ №1:

Один из вариантов, который вы можете сделать, — это список по страницам, который помогает при загрузке,

    string searchString

   if (searchString != null)
   {
       page = 1;
   }
   else
   {
       searchString = currentFilter;
   }

   ViewBag.CurrentFilter = searchString;

   int pageSize = 5;
   int pageNumber = (page ?? 1);
   return View(Users.ToPagedList(pageNumber, pageSize)); 
 

если вы можете уменьшить объем загружаемых данных, это было бы лучше всего, в моем случае я сделал «select» для загрузки только строк с определенным значением

 var VAR = db.YourModel.Where(x => x.YourColumn  == YourString/Value).ToList();
 

Ответ №2:

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

Ответ №3:

SignalR будет работать для этого сценария, есть две точки при загрузке больших наборов данных из БД.

  1. Никогда не используйте *, вместо этого назовите каждое имя столбца, которое вы хотите.
  2. Вы можете сначала получить количество записей в таблице, а затем выполнить выборку на основе размера пакета. Например, у вас 1000 записей в БД, а размер вашего пакета равен 100. Таким образом, вы сделаете 10 запросов к БД, чтобы получить все 1000 элементов.