SQL-нумерация страниц без смещения и индексного столбца - PullRequest
0 голосов
/ 11 марта 2019

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

Я выполняю sql запросы в своем java-приложении, я попробовал способ, только добавив ограничение к моим запросам. Таким образом, это работает так, как смещение всегда будет равно нулю, а предел будет числом (предел + смещение) в соответствии с логикой разбиения на страницы

Пример: пользователь запрашивает 10 записей на странице и переходит на 51 страницу

Альтернативная логика: ограничение 10 смещение 500 -> предел = 510

Запросы выглядят как

select * from history limit 510 order by log_date;

поэтому с помощью absolute метода ResultSet я перехожу к номеру строки согласно указанному смещению и извлекаю результаты после этой строки

    -- No of rows returned 510

    rs.absolute(500);
while(rs.next()){
//store data in the object
}

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

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Мое решение применимо только к Phoenix 4.7 (hdp 2.5), и я нашел способ сортировки данных в порядке возрастания с первичным ключом, и если есть составной ключ, данные были отсортированы согласно первому столбцу ключа. и тогда смещение и предел работают правильно.

0 голосов
/ 11 марта 2019

Таким образом, вы нажимаете на БД при каждом новом запросе страницы - с этим из путаницы:

В приведенном вами примере вы извлекаете весь набор результатов в приложение Java и затем фильтруете. Позвольте Базе данных выполнить фильтрацию и дать вам результат. Отправьте PAGE_NUMBER, который вы хотите, в сам запрос db.

select * from history limit 510 order by log_date 
OFFSET PAGE_NUMBER*MAX_ROWS_TO_SELECT  ROWS FETCH NEXT MAX_ROWS_TO_SELCET ROWS ONLY;

Как уже упоминалось в приведенном выше примере, вы должны получить только 10 записей. Это эффективный способ получения необходимого содержимого страницы в оптимизированном размере набора данных БД.

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