Add 30k Space-Track catalog and benchmark results
Space-Track USSPACECOM catalog: 29,784 objects from full GP query. Benchmark shows SP-GiST index reaches parity with seqscan at 30k: - Delta: +1.6ms (14k) -> +0.9ms (20k) -> +0.0ms (30k) - Planner voluntarily chooses Index Only Scan at this scale - Zero heap fetches (all data served from index pages) - 75.9% candidate pruning on 2h/10deg query Archive includes TLEs from Space-Track, TLE API, and SatNOGS.
This commit is contained in:
parent
5e5588fddb
commit
13d49c1072
115
bench/benchmark_results_30k.txt
Normal file
115
bench/benchmark_results_30k.txt
Normal file
@ -0,0 +1,115 @@
|
||||
pg_orrery v0.7.0 SP-GiST Benchmark — 30k Space-Track Catalog
|
||||
=============================================================
|
||||
Date: 2026-02-17
|
||||
Catalog: Space-Track USSPACECOM full catalog (29,784 objects)
|
||||
Host: Linux 6.16.5-arch1-1, PostgreSQL 17
|
||||
Branch: phase/spgist-orbital-trie
|
||||
|
||||
Catalog Composition:
|
||||
LEO (<128 min): 25,641 (86.1%)
|
||||
MEO (128-720 min): 1,801 ( 6.0%)
|
||||
GEO/HEO (720-1500 min): 2,253 ( 7.6%)
|
||||
Super-GEO (>1500 min): 89 ( 0.3%)
|
||||
|
||||
Index Build:
|
||||
SP-GiST: 46.7 ms, 4,816 kB
|
||||
GiST: 65.8 ms, 5,856 kB
|
||||
Table: 4,760 kB
|
||||
|
||||
==============================================================
|
||||
TIMING RESULTS (best of 3 runs, ms)
|
||||
==============================================================
|
||||
|
||||
Query Pattern | Seqscan | SP-GiST | Delta
|
||||
-----------------------------|---------|---------|-------
|
||||
2h window, Eagle ID, 10 deg | 5.19 | 5.22 | +0.03
|
||||
6h window, Eagle ID, 10 deg | 5.34 | 6.34 | +1.00
|
||||
24h window, Eagle ID, 10 deg | 5.42 | 6.68 | +1.26
|
||||
2h window, Eagle ID, 30 deg | 5.54 | 5.64 | +0.10
|
||||
2h window, equatorial, 10deg | 5.26 | 5.59 | +0.33
|
||||
|
||||
==============================================================
|
||||
PRUNING RESULTS
|
||||
==============================================================
|
||||
|
||||
Query Pattern | Candidates | % Pass | % Pruned
|
||||
-----------------------------|------------|--------|---------
|
||||
2h window, Eagle ID, 10 deg | 7,188 | 24.1% | 75.9%
|
||||
6h window, Eagle ID, 10 deg | 12,373 | 41.5% | 58.5%
|
||||
24h window, Eagle ID, 10 deg | 26,971 | 90.6% | 9.4%
|
||||
2h window, Eagle ID, 30 deg | 5,232 | 17.6% | 82.4%
|
||||
2h window, equatorial, 10deg | 4,670 | 15.7% | 84.3%
|
||||
|
||||
==============================================================
|
||||
BUFFER I/O COMPARISON (2h Eagle 10deg)
|
||||
==============================================================
|
||||
|
||||
Method | Pages Read | Heap Fetches | Scan Type
|
||||
------------|------------|--------------|------------------
|
||||
Seqscan | 595 | n/a | Seq Scan
|
||||
SP-GiST | 2,396 | 0 | Index Only Scan
|
||||
|
||||
SP-GiST reads 4.0x more pages than seqscan (2,396 vs 595).
|
||||
But uses Index Only Scan with zero heap fetches.
|
||||
|
||||
==============================================================
|
||||
CONSISTENCY CHECK
|
||||
==============================================================
|
||||
|
||||
False negatives: 0 (index never misses a seqscan result)
|
||||
False positives: 0 (index never returns extra results)
|
||||
Seqscan count: 7,188
|
||||
SP-GiST count: 7,188
|
||||
|
||||
==============================================================
|
||||
SCALING TREND (2h Eagle 10deg, best-of-3)
|
||||
==============================================================
|
||||
|
||||
Catalog Size | Seqscan | SP-GiST | Delta | SP-GiST Pages | Seq Pages
|
||||
-------------|---------|---------|--------|---------------|----------
|
||||
14,376 | 4.5 ms | 6.1 ms | +1.6ms | 888 | 291
|
||||
20,597 | 3.8 ms | 4.7 ms | +0.9ms | (IOOS) | (est)
|
||||
29,784 | 5.2 ms | 5.2 ms | +0.0ms | 2,396 | 595
|
||||
|
||||
The delta is converging toward zero. At 30k the SP-GiST index is
|
||||
essentially tied with seqscan on the 2h/10deg query. For queries
|
||||
with fewer survivors (30deg elevation, equatorial observer), the
|
||||
index is within 0.1-0.3ms.
|
||||
|
||||
==============================================================
|
||||
PLANNER BEHAVIOR
|
||||
==============================================================
|
||||
|
||||
PostgreSQL's query planner CHOOSES the SP-GiST index by default
|
||||
at 30k (without any enable_seqscan=off forcing). The planner's
|
||||
cost model prefers the Index Only Scan.
|
||||
|
||||
EXPLAIN output (default settings):
|
||||
Index Only Scan using bench_spgist on bench_catalog
|
||||
Index Cond: (tle &? ...)
|
||||
Heap Fetches: 0
|
||||
Buffers: shared hit=2396
|
||||
Execution Time: 7.246 ms (with planning)
|
||||
|
||||
==============================================================
|
||||
NOTES
|
||||
==============================================================
|
||||
|
||||
1. At 30k objects, the planner voluntarily chooses SP-GiST over
|
||||
seqscan. This is the crossover point where the index becomes
|
||||
the planner's preferred strategy.
|
||||
|
||||
2. The Index Only Scan with zero heap fetches means the index
|
||||
contains all information needed — no table access required.
|
||||
|
||||
3. The 75.9% pruning rate on the 2h window means only 7,188 of
|
||||
29,784 satellites need SGP4 propagation. This avoids ~22,596
|
||||
unnecessary SGP4 calls in the predict_passes() pipeline.
|
||||
|
||||
4. The equatorial observer (84.3% pruned) and high-elevation
|
||||
(82.4% pruned) queries show the strongest filtering because
|
||||
the altitude and RAAN filters are most aggressive there.
|
||||
|
||||
5. The 24h window only prunes 9.4% because the RAAN filter
|
||||
self-disables for full Earth rotations, leaving only the
|
||||
altitude and inclination filters active.
|
||||
59577
bench/load_spacetrack.sql
Normal file
59577
bench/load_spacetrack.sql
Normal file
File diff suppressed because it is too large
Load Diff
90129
bench/spacetrack_full.tle
Normal file
90129
bench/spacetrack_full.tle
Normal file
File diff suppressed because it is too large
Load Diff
BIN
bench/tle_archives.tar.gz
Normal file
BIN
bench/tle_archives.tar.gz
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user