#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
.