Сначала можно выполнить запрос на выборку, но затем некоторые данные могли быть добавлены или удалены. Заверните его в транзакцию, и у вас возникнет огромная проблема с блокировкой.
Другим способом было бы получить страницу 1, а затем получить остатки в пакетах в другом потоке, когда это завершит обновление счетчика и отображения, вы можете даже иметь счетчик выполнения, чтобы указать прогресс в получении всех данных.
Почему вы получаете все записи одновременно?
Если вы рассматриваете это как получение первой, последней, предыдущей и следующей страницы.
А затем, если вы решите проблемы, возникающие в результате такого подхода, у вас будет масштабируемое решение.
Причина, по которой подсчет занимает так много времени, заключается в том, что ему приходится всасывать все 10000 записей в клиент для их подсчета.
Это решение, которое очень плохо масштабируется, представьте 100 000 или миллион!
Другой момент - латентность. Те 100 000 во время выполнения запроса, обновление не будет популярным, не так ли? Затем, когда вы обновите страницу, у вас появятся все страницы, на которых вы находились ...
Если вы переработали его, чтобы получить следующие n записей после последней, отображаемой в данный момент, или до первой ...
Затем вы можете кешировать, вы можете обновить страницы в фоновом режиме, вы можете попытаться предсказать запрос, скажем, получить следующие n страниц заранее.