Bird
Raised Fist0
Spring Bootframework~8 mins

Pagination and sorting with Pageable in Spring Boot - Performance & Optimization

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Performance: Pagination and sorting with Pageable
MEDIUM IMPACT
This concept affects how much data is loaded and rendered at once, impacting page load speed and responsiveness when displaying lists.
Loading large lists of data in a web app
Spring Boot
Pageable pageable = PageRequest.of(page, size, Sort.by("name").ascending());
Page<Item> items = itemRepository.findAll(pageable);
Loads only a subset of data per request with sorting, reducing memory and network load.
📈 Performance GainReduces initial load time significantly; triggers only necessary database queries; improves LCP
Loading large lists of data in a web app
Spring Boot
List<Item> items = itemRepository.findAll(); // loads all items without pagination or sorting
Loads entire dataset into memory and sends all data to client, causing slow page loads and high memory use.
📉 Performance CostBlocks rendering for hundreds of milliseconds or more depending on data size; high memory usage
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Load all data at onceHigh (many nodes)Multiple reflows due to large DOMHigh paint cost[X] Bad
Use Pageable for pagination and sortingLow (limited nodes)Single reflow per page loadLow paint cost[OK] Good
Rendering Pipeline
Pagination limits data fetched and sent to the client, reducing the amount of DOM nodes created and CSS painted. Sorting ensures data is ordered before rendering, avoiding client-side reordering.
Data Fetching
DOM Construction
Layout
Paint
⚠️ BottleneckData Fetching and DOM Construction when loading large datasets without pagination
Core Web Vital Affected
LCP
This concept affects how much data is loaded and rendered at once, impacting page load speed and responsiveness when displaying lists.
Optimization Tips
1Always fetch only the data needed for the current page to reduce load time.
2Use server-side sorting to avoid client-side layout shifts and reflows.
3Avoid loading entire datasets at once to prevent blocking rendering and high memory use.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance benefit of using Pageable for pagination?
AIt limits the amount of data fetched and rendered per page.
BIt caches all data on the client for faster access.
CIt sorts data on the client side after loading all items.
DIt increases the number of DOM nodes to improve layout.
DevTools: Performance
How to check: Record a performance profile while loading the page with and without pagination. Compare scripting and rendering times.
What to look for: Look for long scripting tasks and large layout or paint times indicating heavy DOM or data processing.

Practice

(1/5)
1. What is the main purpose of using Pageable in Spring Boot?
easy
A. To fetch data in small chunks with optional sorting
B. To connect to the database directly
C. To write SQL queries manually
D. To handle user authentication

Solution

  1. Step 1: Understand Pageable's role

    Pageable is used to request data in pages, not all at once.
  2. Step 2: Recognize sorting feature

    It also supports sorting data by fields while fetching pages.
  3. Final Answer:

    To fetch data in small chunks with optional sorting -> Option A
  4. Quick Check:

    Pageable = Pagination + Sorting [OK]
Hint: Pageable means small pages + sorting [OK]
Common Mistakes:
  • Thinking Pageable connects to database
  • Confusing Pageable with authentication
  • Assuming Pageable writes SQL queries
2. Which of the following is the correct way to create a Pageable object for page 2, size 5, sorted by "name" ascending?
easy
A. PageRequest.of(1, 5, Sort.by("name"))
B. PageRequest.of(2, 5, Sort.asc("name"))
C. PageRequest.of(2, 5, Sort.by("name"))
D. PageRequest.create(2, 5, Sort.by("name"))

Solution

  1. Step 1: Understand zero-based page index

    Page numbers start at 0, so page 2 means index 1.
  2. Step 2: Check method and sorting syntax

    Use PageRequest.of(page, size, Sort.by("field")) for ascending sort.
  3. Final Answer:

    PageRequest.of(1, 5, Sort.by("name")) -> Option A
  4. Quick Check:

    Page index zero-based + Sort.by correct [OK]
Hint: Page index starts at 0, so page 2 is index 1 [OK]
Common Mistakes:
  • Using page number directly instead of zero-based index
  • Using non-existent methods like Sort.asc
  • Using PageRequest.create instead of PageRequest.of
3. Given this repository method call:
repository.findAll(PageRequest.of(0, 3, Sort.by("age")))
What will be the result?
medium
A. Error because Sort direction is missing
B. First 3 records sorted by age descending
C. All records without sorting
D. First 3 records sorted by age ascending

Solution

  1. Step 1: Analyze PageRequest parameters

    Page 0 means first page, size 3 means 3 records, Sort.by("age") defaults to ascending.
  2. Step 2: Understand repository behavior

    findAll with Pageable returns that page of sorted data.
  3. Final Answer:

    First 3 records sorted by age ascending -> Option D
  4. Quick Check:

    Page 0 + size 3 + ascending sort = first 3 sorted [OK]
Hint: Sort.by defaults to ascending if direction not set [OK]
Common Mistakes:
  • Assuming descending sort without direction
  • Thinking all records are returned
  • Expecting error due to missing direction
4. What is wrong with this code snippet?
Pageable pageable = PageRequest.of(1, 10, Sort.asc("date"));
medium
A. Page index should start at 0, not 1
B. Sort.asc() method does not exist
C. Page size cannot be 10
D. PageRequest.of requires 4 parameters

Solution

  1. Step 1: Check Sort method usage

    Spring Data uses Sort.by(), not Sort.asc().
  2. Step 2: Verify other parameters

    Page index 1 and size 10 are valid; PageRequest.of takes 3 parameters here.
  3. Final Answer:

    Sort.asc() method does not exist -> Option B
  4. Quick Check:

    Use Sort.by() for sorting [OK]
Hint: Use Sort.by(), not Sort.asc() [OK]
Common Mistakes:
  • Using Sort.asc() or Sort.desc() which don't exist
  • Thinking page index must be 0 always
  • Believing PageRequest.of needs 4 parameters
5. You want to fetch the third page of size 4, sorted by "price" descending and then by "name" ascending. Which Pageable creation is correct?
hard
A. PageRequest.of(2, 4, Sort.by("price", "name"))
B. PageRequest.of(3, 4, Sort.by("price").descending().and(Sort.by("name")))
C. PageRequest.of(2, 4, Sort.by(Sort.Order.desc("price"), Sort.Order.asc("name")))
D. PageRequest.of(2, 4, Sort.by("price").desc().and(Sort.by("name").asc()))

Solution

  1. Step 1: Identify zero-based page index

    Third page means index 2 (0,1,2).
  2. Step 2: Create Sort with multiple orders

    Use Sort.by(Order.desc("price"), Order.asc("name")) to combine sorting directions.
  3. Step 3: Check syntax correctness

    PageRequest.of(2, 4, Sort.by(Sort.Order.desc("price"), Sort.Order.asc("name"))) uses correct PageRequest.of and Sort.by with orders.
  4. Final Answer:

    PageRequest.of(2, 4, Sort.by(Sort.Order.desc("price"), Sort.Order.asc("name"))) -> Option C
  5. Quick Check:

    Page 2 + size 4 + multi-sort orders correct [OK]
Hint: Use Sort.Order for multi-direction sorting [OK]
Common Mistakes:
  • Using page number 3 instead of index 2
  • Trying to chain .desc() or .asc() methods that don't exist
  • Passing multiple fields without specifying order