diff --git a/test/vinyl/deferred_delete.result b/test/vinyl/deferred_delete.result
index 61f81ce2659753d910ff086858a25a55736f1e6a..0a380ed56e5d8f490dbe12860774e3eb10c12940 100644
--- a/test/vinyl/deferred_delete.result
+++ b/test/vinyl/deferred_delete.result
@@ -503,6 +503,14 @@ pk = s:create_index('pk', {run_count_per_level = 10})
 sk = s:create_index('sk', {run_count_per_level = 10, parts = {2, 'unsigned'}, unique = false})
 ---
 ...
+-- Write a run big enough to prevent major compaction from kicking in
+-- (run_count_per_level is ignored on the last level - see gh-3657).
+dummy_rows = 100
+---
+...
+for i = 1001, 1000 + dummy_rows do s:replace{i, i} end
+---
+...
 for i = 1, 10 do s:replace{i, i} end
 ---
 ...
@@ -525,19 +533,19 @@ for i = 2, 10, 2 do s:replace{i, i * 100} end
 box.commit()
 ---
 ...
-sk:select()
+sk:select({1000}, {iterator = 'le'})
 ---
-- - [2, 200]
-  - [4, 400]
-  - [6, 600]
+- - [10, 1000]
   - [8, 800]
-  - [10, 1000]
+  - [6, 600]
+  - [4, 400]
+  - [2, 200]
 ...
-pk:stat().rows -- 10 old REPLACEs + 5 DELETEs + 5 new REPLACEs
+pk:stat().rows - dummy_rows -- 10 old REPLACEs + 5 DELETEs + 5 new REPLACEs
 ---
 - 20
 ...
-sk:stat().rows -- 10 old REPLACEs + 5 new REPLACEs
+sk:stat().rows - dummy_rows -- 10 old REPLACEs + 5 new REPLACEs
 ---
 - 15
 ...
@@ -563,19 +571,19 @@ sk:compact()
 while sk:stat().disk.compaction.count == 0 do fiber.sleep(0.001) end
 ---
 ...
-sk:select()
+sk:select({1000}, {iterator = 'le'})
 ---
-- - [2, 200]
-  - [4, 400]
-  - [6, 600]
+- - [10, 1000]
   - [8, 800]
-  - [10, 1000]
+  - [6, 600]
+  - [4, 400]
+  - [2, 200]
 ...
-pk:stat().rows -- 5 new REPLACEs
+pk:stat().rows - dummy_rows -- 5 new REPLACEs
 ---
 - 5
 ...
-sk:stat().rows -- ditto
+sk:stat().rows - dummy_rows -- ditto
 ---
 - 5
 ...
diff --git a/test/vinyl/deferred_delete.test.lua b/test/vinyl/deferred_delete.test.lua
index 93b5b35840e3a71351d69cc1547eb9f97ab62f02..240429fc2360e45b391a6c50c4cb645e662bed3f 100644
--- a/test/vinyl/deferred_delete.test.lua
+++ b/test/vinyl/deferred_delete.test.lua
@@ -184,6 +184,12 @@ s:drop()
 s = box.schema.space.create('test', {engine = 'vinyl'})
 pk = s:create_index('pk', {run_count_per_level = 10})
 sk = s:create_index('sk', {run_count_per_level = 10, parts = {2, 'unsigned'}, unique = false})
+
+-- Write a run big enough to prevent major compaction from kicking in
+-- (run_count_per_level is ignored on the last level - see gh-3657).
+dummy_rows = 100
+for i = 1001, 1000 + dummy_rows do s:replace{i, i} end
+
 for i = 1, 10 do s:replace{i, i} end
 box.snapshot()
 
@@ -193,10 +199,10 @@ for i = 1, 10, 2 do s:delete{i} end
 for i = 2, 10, 2 do s:replace{i, i * 100} end
 box.commit()
 
-sk:select()
+sk:select({1000}, {iterator = 'le'})
 
-pk:stat().rows -- 10 old REPLACEs + 5 DELETEs + 5 new REPLACEs
-sk:stat().rows -- 10 old REPLACEs + 5 new REPLACEs
+pk:stat().rows - dummy_rows -- 10 old REPLACEs + 5 DELETEs + 5 new REPLACEs
+sk:stat().rows - dummy_rows -- 10 old REPLACEs + 5 new REPLACEs
 
 -- Compact the primary index to generate deferred DELETEs.
 box.snapshot()
@@ -208,10 +214,10 @@ box.snapshot()
 sk:compact()
 while sk:stat().disk.compaction.count == 0 do fiber.sleep(0.001) end
 
-sk:select()
+sk:select({1000}, {iterator = 'le'})
 
-pk:stat().rows -- 5 new REPLACEs
-sk:stat().rows -- ditto
+pk:stat().rows - dummy_rows -- 5 new REPLACEs
+sk:stat().rows - dummy_rows -- ditto
 
 s:drop()