Данные Spring — является ли срез быстрее страницы, если он использует порядок по?

#spring #hibernate #spring-data

Вопрос:

Если использование org.springframework.data.domain.Slice вместо org.springframework.data.domain.Page возврата результатов для просмотра страниц в целом выполняется быстрее — потому что Slice не вызывает count(*) — будет ли это еще быстрее, если запрос также выполняет заказ по ?

Другими словами, является ли первый пример медленнее второго ?

Первый пример с использованием Page :

 Pageable sortedByName = PageRequest.of(0, 3, Sort.by("name"));
Page<Employee> firstEmployeePage = employeeRepository.findAll(sortedByName);
 

Второй пример с использованием Slice :

 Pageable sortedByName = PageRequest.of(0, 3, Sort.by("name"));
Slice<Employee> firstEmployeePage = employeeRepository.findAll(sortedByName);
 

Ответ №1:

Page Выполнение A почти то же самое, что запрос для a Slice и выполнение запроса на подсчет. Разница лишь в том, что Slice будете использовать LIMIT (n 1) . Обладая этими знаниями, вы должны понимать, что выполнение среза всегда происходит быстрее, так как запрос на подсчет обычно должен каким-либо образом «посетить все строки», чтобы определить количество.

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

1. На самом деле я хотел выяснить, имеют ли Страница и срез одинаковую производительность при использовании «по порядку». Насколько я понимаю, когда выполняется «по порядку», движок должен выполнить итерацию по всем строкам, прежде чем возвращать страницу/срез, поэтому, хотя Срез не выполняет подсчет (*), он уже прошел по всем строкам (потому что он должен знать порядок), и поэтому я ожидаю, что оба (Срез и Страница) будут иметь одинаковую производительность.

2. Запрос count по-прежнему должен просматривать некоторые структуры данных, возможно, выполнять объединения, а для больших таблиц выполнять ввод-вывод, поэтому запрос count-это то, что сделает все медленнее. Фрагмент или страница не имеют смысла без заказа, поэтому вам всегда нужен order by .