Repository navigation
Commit 8948b54
authored
perf(file-search): probe each backfill page's revisions by primary key (#9445)
The backfill walk checked each file for a revision with a correlated EXISTS
in its select list. PostgreSQL plans that as an alternative subplan and picks
between a per-row probe and a hashed subplan from the scan's own row estimate,
before the page limit applies. Sized against every file left in the walk, the
hashed form wins, so every page sequentially scanned and hashed the whole
revision table to answer a thousand lookups.
The page now left-joins the revision on its primary key, the file id, and
reads hasRevision as the joined key being non-null. Under the limit the
planner nests that join over the ordered keyset scan, one index probe per file
returned. The key is unique, so the join cannot repeat a file, and the keyset
predicate, order and limit are unchanged.
On a production-sized replica the page went from about 500ms with a full scan
of the revision table to about 12ms warm with index probes, with the keyset
index scan on workspace_files unchanged.
The new integration case walks a second page over a settled table and asserts
the revision table is only read through its primary key, probed per file; it
fails on the previous query with the hashed sequential scan.1 parent 467236e commit 8948b54
2 files changed
Lines changed: 56 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
| 45 | + | |
45 | 46 | | |
46 | 47 | | |
47 | 48 | | |
| |||
478 | 479 | | |
479 | 480 | | |
480 | 481 | | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
481 | 526 | | |
482 | 527 | | |
483 | 528 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
217 | 217 | | |
218 | 218 | | |
219 | 219 | | |
220 | | - | |
| 220 | + | |
221 | 221 | | |
222 | 222 | | |
223 | 223 | | |
| |||
228 | 228 | | |
229 | 229 | | |
230 | 230 | | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
231 | 236 | | |
232 | 237 | | |
233 | 238 | | |
| |||
265 | 270 | | |
266 | 271 | | |
267 | 272 | | |
268 | | - | |
269 | | - | |
270 | | - | |
271 | | - | |
272 | | - | |
273 | | - | |
| 273 | + | |
274 | 274 | | |
275 | 275 | | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
276 | 280 | | |
277 | 281 | | |
278 | 282 | | |
| |||
0 commit comments