Every Pixeltable release, measured

We run one workload on every Pixeltable release, on one machine, and log what changed the numbers and why.

16 releases, 0.7.0 to 0.7.15, on one Apple M4 Pro. Recorded October 8, 2026. Dev log · Releases · Method

0.7.15 against 0.7.0

One-row insert

CPU time per insert into a table with two computed columns, median of 300

0.7.15 2.45 ms

4 ms0.7.00.7.150.7.0: 2.99 ms0.7.1: 2.96 ms0.7.2: 2.37 ms0.7.3: 2.29 ms0.7.4: 2.55 ms0.7.5: 2.50 ms0.7.6: 2.51 ms0.7.7: 2.44 ms0.7.8: 2.39 ms0.7.9: 2.42 ms0.7.10: 2.42 ms0.7.11: 2.41 ms0.7.12: 2.45 ms0.7.13: 2.43 ms0.7.14: 2.48 ms0.7.15: 2.45 ms

100-row batch insert

Rows per second over 20 batches of 100

0.7.15 18,222 rows/s

30,000 rows/s0.7.00.7.150.7.0: 11,826 rows/s0.7.1: 11,605 rows/s0.7.2: 19,059 rows/s0.7.3: 19,448 rows/s0.7.4: 18,591 rows/s0.7.5: 17,989 rows/s0.7.6: 18,258 rows/s0.7.7: 18,218 rows/s0.7.8: 18,786 rows/s0.7.9: 18,632 rows/s0.7.10: 18,797 rows/s0.7.11: 18,636 rows/s0.7.12: 18,235 rows/s0.7.13: 18,847 rows/s0.7.14: 18,090 rows/s0.7.15: 18,222 rows/s

10,000-row backfill

CPU time to add the same two computed columns to a table of 10,000 rows

0.7.15 0.41 s

1.1 s0.7.00.7.150.7.0: 0.90 s0.7.1: 0.93 s0.7.2: 0.41 s0.7.3: 0.41 s0.7.4: 0.37 s0.7.5: 0.43 s0.7.6: 0.39 s0.7.7: 0.40 s0.7.8: 0.39 s0.7.9: 0.37 s0.7.10: 0.41 s0.7.11: 0.41 s0.7.12: 0.41 s0.7.13: 0.41 s0.7.14: 0.41 s0.7.15: 0.41 s
Step0.7.00.7.15Change
One-row insertCPU time per insert into a table with two computed columns, median of 3002.99 ms2.45 ms1.2x faster
100-row batch insertRows per second over 20 batches of 10011,826 rows/s18,222 rows/s1.5x faster
10,000-row backfillCPU time to add the same two computed columns to a table of 10,000 rows0.90 s0.41 s2.2x faster
Point queryCPU time per filtered select of one row from 300, median of 3001.77 ms1.89 msno clear change
Table.compute() on one rowCPU time per call, median of 3001.02 ms0.95 msno clear change
import pixeltableWall time for a fresh interpreter3.05 s3.19 sno clear change
SQL statements per insertCounted from SQLAlchemy cursor events1111same

Each value is the best of 5 runs. Compare releases with each other, not with a different machine. How we measure

Dev log

Every 0.7 insert sends 11 SQL statements

A one-row insert into a table with two computed columns sends 11 SQL statements in every release from 0.7.0 to 0.7.15.

Here the database is an embedded Postgres on the same machine, so a whole insert takes about 2.45 ms of CPU. On a hosted database each statement is a network round trip, which is why the same insert takes tens of milliseconds on the cloud comparison.

0.7.2 made backfills twice as fast by indexing less

From 0.7.1 to 0.7.2, the 10,000-row backfill went from 0.93 s to 0.41 s of CPU, 100-row batches from 11,605 rows/s to 19,059 rows/s, and a one-row insert from 2.96 ms to 2.37 ms. No later release has moved them since.

0.7.2 stopped creating a B-tree index on every column by default; Table.add_btree_index() adds one where a query needs it. To check that this change accounts for the whole step, we added the indexes back to 0.7.14: it measured 0.90 to 0.95 s for the backfill and about 11,400 rows/s, which are 0.7.1's numbers.

Our point query filters a 300-row table, where an index makes no measurable difference. On a large table, a filter on a column with no index scans the table.

Releases

  1. 0.7.15

    One-row insert
    2.45 ms
    100-row batch insert
    18,222 rows/s
    10,000-row backfill
    0.41 s
    19 changes
    • new pxt secret list: final protocol cleanup #1705
    • pxt db update: print the pending plan once on non-tty refusal #1707
    • Store hosted array, binary and json cell files in the home bucket #1703
    • Give a cold control plane time to answer a bucket-credential request #1709
    • Run the hosted CLI tests under -k cloud, and report a refused tunnel key properly #1702
    • Fix notebook CI failures (HF apply, Veo 2 in video-generate-ai, whisperx) #1713
    • Fix anthropic notebook #1712
    • Fix queries-and-expressions notebook #1715
    • working-with-gemini: replace retired Veo 2 model, mark Imagen as Vertex AI only #1714
    • boto3 is a core dependency #1710
    • Tell readers to resume an interrupted Cloud update #1717
    • Preserve dictionary key order in JsonType literals #1696
    • Fix two CI flakes: picked ports taken before use, and proxy requests outliving their test #1720
    • Write proxy RPC bodies in 16 MiB slices so bodies over 2 GiB work on macOS #1716
    • Raise the file cache stress test lease to 2s in CI #1723
    • Fix nightly: stale tests, a view-load bug and the notebook runner #1719
    • Stop reusing a tunnel connection before the daemon closes it as idle #1721
    • Row update support for operational tables #1558
    • Cover hosted secret overwrite and delete through pxt secret #1724
  2. 0.7.14

    One-row insert
    2.48 ms
    100-row batch insert
    18,090 rows/s
    10,000-row backfill
    0.41 s
    2 changes
    • Describe the hosted Cloud MCP's operations #1706
    • pxt whoami: flush stdout before printing a credential rejection #1704
  3. 0.7.13

    One-row insert
    2.43 ms
    100-row batch insert
    18,847 rows/s
    10,000-row backfill
    0.41 s
    9 changes
    • Stop requiring unused inputs in compute routes #1665
    • Document hosted Cloud MCP and existing Pixeltable plugins #1683
    • Update running hosted services in place instead of stopping them #1677
    • Add pxt new: a free Pixeltable Cloud database, no account needed #1679
    • Fix parameterized comparison not using B-tree index #1686
    • Reject non-constant seed parameters in select query #1690
    • Model diff takes into account changes to a @pxt.query function's body #1691
    • Fix pxtfs:// store building a boto3 session for nearly every media read #1698
    • Tell users how to recover from a proxy protocol mismatch #1697
  4. 0.7.12

    One-row insert
    2.45 ms
    100-row batch insert
    18,235 rows/s
    10,000-row backfill
    0.41 s
    13 changes
    • Restore the Cloud guide at /cloud #1680
    • Give a "missing API key" error that's appropriate for the CLI #1668
    • Document how pxt get parses primary key values #1675
    • run hosted_environment fixture before others #1671
    • pxt cli changes that implement a better pxt secret list experience #1684
    • App-load errors name the exception type #1673
    • improve pxt service stop #1676
    • Require OpenAI SDK version >= 3 #1692
    • Give whisper.transcribe() a TypedDict return type #1693
    • Coalesce media, array, and binary files on insertion #1661
    • Fix Variable handling in aggregate queries #1689
    • Fix for serving routes with @pxt.query #1694
    • pxt login scopes the session to the user's only organization #1695
  5. 0.7.11

    One-row insert
    2.41 ms
    100-row batch insert
    18,636 rows/s
    10,000-row backfill
    0.41 s
    10 changes
    • Don't assert on failed object store save with on_error='ignore' #1653
    • Fix missing * and / in UDF signatures #1659
    • Per-database media destinations and OTLP endpoint #1627
    • pxt db delete prompts confirmation or needs -f #1669
    • Improve service OpenAPI and TypeScript integration #1658
    • Docs: document stitch_tiles order-expression argument #1655
    • Properly handle TypedDicts in from __future__ import annotations #1666
    • Better pxt secret list: management protocol change #1663
    • Normalize case for DB names in [[pixeltable.database]] configs #1662
    • Fail fast on invalid TOML #1660
  6. 0.7.10

    One-row insert
    2.42 ms
    100-row batch insert
    18,797 rows/s
    10,000-row backfill
    0.41 s
    2 changes
    • , Alter Computed Column support with unchanged column type #1600
    • pxt login, pxt key, pxt whoami (supersedes #1650) #1657
  7. 0.7.9

    One-row insert
    2.42 ms
    100-row batch insert
    18,632 rows/s
    10,000-row backfill
    0.37 s
    14 changes
    • Fix the daemon hijack issue in our cli tests #1633
    • Unpack archive before launching proxy daemon #1640
    • Add missing require_package() guard for sentence-transformers #1643
    • --json-schema flag for various CLI commands #1637
    • Restrict users to create secrets starting by PIXELTABLE_* #1629
    • Cloud test suite improvements #1644
    • Let the page menu install the docs search MCP #1646
    • Remove stray pixeltable import from a CLI client module #1645
    • Docs: fix what executing every page's code found #1647
    • Two review threads #1647 merged over: ai-skills.mdx and the outputs bullet #1654
    • Fix nightly MCP and optional notebook dependencies #1598
    • exclude cloud tests from make slimtest #1656
    • Fix for cross-device move #1652
    • Fix for @query references in update_all() #1651
  8. 0.7.8

    One-row insert
    2.39 ms
    100-row batch insert
    18,786 rows/s
    10,000-row backfill
    0.39 s
    20 changes
    • Docs Updates: Name first-run commands so a pip 0.7.6 reader types pxt schema update. #1611
    • Drop the org URI from the commands where it is the only argument #1613
    • Fail a request immediately (no retries) if the pod becomes unresponsive waiting for a response #1607
    • Upload bytes and ndarrays out of band during insertion #1609
    • pxt.Array slice fixes #1612
    • Require sentence_transformers >= 5.4 #1620
    • Fixes for test_fastapi.py in cloud #1619
    • Add the missing verbs to the pxt schema and pxt service help text #1618
    • PXT-1393: add_update_route and batch_update reject a computed uuid7 #1623
    • Docs: hosted Media Store is the default; PIXELTABLE_API_KEY is the env name #1625
    • PXT-1412: config.toml cannot set any int option #1626
    • Docs: unify agent instructions, and encode review rules mined from 100 PRs #1628
    • Upgrade specs on test db #1630
    • Presign media that hosted compute and query routes make on the fly #1624
    • Docs: match the three app.py mirrors to what pxt service example writes #1632
    • Image/archive split #1610
    • Don't generate changelog in CI #1635
    • Docs: Cloud page, #1610 and #205 follow-through, one positioning line, and an agent block #1634
    • insert(Query) / create_table(source=Query) crashes with AssertionError on any join #1606
    • Fix LLM tells in CLI output. #1636
  9. 0.7.7

    One-row insert
    2.44 ms
    100-row batch insert
    18,218 rows/s
    10,000-row backfill
    0.40 s
    2 changes
    • [PXT-1370 + PXT-1349 + PXT-1323] Hosted media defaults to the database's home bucket #1604
    • pxt db logs and pxt service logs #1593
  10. 0.7.6

    One-row insert
    2.51 ms
    100-row batch insert
    18,258 rows/s
    10,000-row backfill
    0.39 s
    18 changes
    • Remove 'poetry' lockfile support #1584
    • Add py.typed marker to pixeltable_cli #1585
    • Flatten included FastAPI routers #1586
    • Note that Pixeltable Cloud is in Limited Beta #1588
    • Exclude Python virtual environments by default from archive packaging #1582
    • --host/--port for CLI and proxy daemons #1587
    • pxt recompute #1589
    • PXT-1353: pxt service update keeps stable port #1579
    • Fix unnecessary memory pressure when multiple insert plans are executed sequentially #1592
    • PXT-1352: Performance improvements for proxy queries #1581
    • Update dev dependencies for third-party SDKs #1590
    • Docs: fix the broken first run, delete orphan pages, repair nav #1597
    • Fix index diff management in schema update when redefining an index #1580
    • PXT-1359 Set root_path on hosted services so /docs can fetch its spec #1601
    • Drop db_name from the hosted database protocol #1602
    • Redact password in db connection string #1596
    • document_splitter should close pdfs properly #1603
    • Normalize kwarg order in FunctionCall deserialization #1599
  11. 0.7.5

    One-row insert
    2.50 ms
    100-row batch insert
    17,989 rows/s
    10,000-row backfill
    0.43 s
    4 changes
    • fix: lineage/history follow the active catalog #1523
    • Make /health endpoint async to avoid starvation under load #1575
    • Refactor pxt db CLI tests #1576
    • Docs overhaul for launch: TableModel first run, Cloud, and How it works #1562
  12. 0.7.4

    One-row insert
    2.55 ms
    100-row batch insert
    18,591 rows/s
    10,000-row backfill
    0.37 s
    5 changes
    • Make table, column, and database identifiers case-insensitive #1549
    • pxt db #1568
    • Allow configuring SQLAlchemy pool size in Pixeltable config #1572
    • Ensure base table columns are in scope for view models #1570
    • PXT-1339: broken module eviction logic #1574
  13. 0.7.3

    One-row insert
    2.29 ms
    100-row batch insert
    19,448 rows/s
    10,000-row backfill
    0.41 s
    36 changes
    • Schema types are now non-nullable by default, following standard type conventions #1528
    • Reduce the pr (i.e. on push) test coverage to only static checks + slimtest #1522
    • fix(dashboard): show API error reason, not just HTTP 403 #1524
    • retry network transport errors #1529
    • Drive pixeltable log levels from config, so spawned processes inherit them #1530
    • fix(dashboard): read TableMetadata.indexes after #1518 rename #1531
    • Detailed error reporting from daemon in tests #1533
    • docs: Add Nebius Token Factory provider notebook #1462
    • Direct b-tree and embedding index support for operational tables #1515
    • Update Groq examples to openai/gpt-oss-20b #1541
    • Test harness for Pixeltable cloud #1539
    • [ docs ] Fix parsing error for AI skills page #1509
    • Avoid going on network in tests when possible #1527
    • slimtest target extended to include more core tests #1540
    • ConfigVar + FastAPIRouter for models #1510
    • retry ollama installation in CI #1543
    • Add cli for pxt secret #1544
    • Fix merge queue #1548
    • include ubuntu + python 3.14 in pr checks #1547
    • PXT-1297: fix async teardown #1535
    • CI improvements #1550
    • Replace deprecated Nebius models #1546
    • Local file insertion for cloud hosted tables #1545
    • ci tool unit tests #1534
    • Various test fixes to run on cloud-hosted tables #1553
    • constraint the preshed version #1554
    • Operational tables: new schema features and better testing #1538
    • Allow iterators to be defined in modules with from __future__ import annotations #1556
    • More fixes for [cloud] tests #1555
    • pxt service #1542
    • Use aware timestamps as inputs to test_timestamp_btree #1560
    • Refactor fixtures for local/proxy/cloud test selection #1563
    • Enable TableModelMeta to work on Python 3.14+ without from __future__ import annotations #1564
    • Show reasonable error messages if a UDF or iterator can't be resolved on the cloud db #1559
    • Add uv_options to DatabaseConfig & refactor metadata.json #1565
    • Add mixed-case schema objects to the test db dump #1566
  14. 0.7.2

    One-row insert
    2.37 ms
    100-row batch insert
    19,059 rows/s
    10,000-row backfill
    0.41 s
    14 changes
    • Remove support for Python 3.10 #1508
    • Table.add_btree_index(), stop adding b-tree indexes by default #1472
    • Add client side db name validation #1496
    • Local dashboard design system + sticky catalog switcher #1513
    • add timeout to cli invocations in tests #1507
    • Remove everything Reve-related #1516
    • Pixeltable daemon logs at DEBUG during tests #1514
    • Disable TestVideo.test_basic[proxy] on Windows #1520
    • Exclude most integration tests from merge queue #1521
    • Fix TestSchema.test_example() #1525
    • Test issues with Yolox #1517
    • Add a CI step to validate dependency bounds in pyproject.toml #1503
    • Altered syntax for index specification in table models #1518
    • Run TestVideo.test_basic with xfail on Windows #1526
  15. 0.7.1

    One-row insert
    2.96 ms
    100-row batch insert
    11,605 rows/s
    10,000-row backfill
    0.93 s
    9 changes
    • Shrink the user guide in our docs #1492
    • Add test timeouts #1498
    • bump random ops duration from 15 to 30 minutes in pr checks #1495
    • operational tables: rename "unversioned" to "operational" and "versioned" to "data versioned" #1497
    • rename data_versioned to is_data_versioned where appropriate #1501
    • Dependabot fixes 2026-07-23 #1486
    • stress-tests.yml: disable fail-fast #1499
    • Fixing CLI test failure (TestHealth) #1505
    • Move filecache_multiprocess_stress.py from scripts to tool #1504
  16. 0.7.0

    One-row insert
    2.99 ms
    100-row batch insert
    11,826 rows/s
    10,000-row backfill
    0.90 s
    21 changes
    • exclude ollama nb test from merge queue #1471
    • mark more network-dependent tests for retry #1476
    • Fix SAM3 segmentation with no detections #1478
    • get rid of caching in TableVersionHandle #1464
    • nightly github action uploads test reports as github artifacts #1477
    • update ci lint coverage #1482
    • Fix test_db_migration + more #1484
    • alter column to change non-nullable type to nullable #1450
    • TableModel.diff_all() and TableModel.update_all() #1479
    • Handling pg server termination in xact retry logic. #1473
    • Update models used by deepseek test #1489
    • Migrate to pgvector 0.5.0 #1488
    • Parallelize CI test runs #1395
    • PXT-1227: View.compute() #1475
    • TableModes.update_all() bug fixes #1490
    • CLI commands: cwd/pwd #1474
    • Proxy mode test infra improvements #1483
    • Evict LRU entries from Catalog cache #1481
    • pxt schema commands #1491
    • Cloud-hosted databases: client SDK and CLI #1493
    • Dashboard - multi-catalog browsing, pipeline inspector, table detail #1494

Method

  • Each release is installed from PyPI into its own Python 3.12 environment and runs the same script, which uses only API that every 0.7 release has.
  • Every 0.7 release bundles the same embedded Postgres (pixeltable-pgserver 0.5.0), so the database stays fixed and only Pixeltable changes between releases.
  • Each run starts from an empty Pixeltable home. Runs are interleaved, every release once and then again, so a busy minute on the machine lands on every release rather than one.
  • Times are CPU time where the step allows it, which other work on the machine barely changes. We show the best of 5 runs per release.
  • Machine: Apple M4 Pro, 48 GB, macOS 26.6.1. Other applications were running, so a quiet machine gives lower absolute times; the comparison between releases is what holds.