perf(results): build typed columns directly from the driver stream instead of collecting List<List<Object?>> first
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 42/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- dart, mysql, postgresql, sqlite
- Domain
- database, performance
Research direction
Read postgres_sql_workspace.dart, mysql_sql_workspace.dart, and sqlite_sql_workspace.dart to trace how each driver currently collects rows and builds CompactResultDataset; then inspect CompactResultDataset.fromRawRows and the related work in #1548. Define a shared builder that preserves current mixed-type and NULL behavior, and use existing dataset tests to check it across all three drivers. Done means those tests pass and the PR reports peak RSS and timings for 5k and 50k rows.
Written by the indexing model from the issue text.
Description
Problem
Each SQL driver workspace builds an intermediate List<List<Object?>> of the whole result and only then packs it into typed columns (CompactResultDataset.fromRawRows):
- PostgreSQL (
postgres_sql_workspace.dart):rawRows.add(row.toList())for every row. - MySQL (
mysql_sql_workspace.dart):taken.items(allResultSetRows kept) and then[for (i...) row.colAt(i)]per row. - SQLite: same pattern (
sqlite_sql_workspace.dart).
So every cell is copied into a per-row list once, kept alive until the dataset is built, and then read again column by column.
Measurements
Local PostgreSQL 16 / MySQL 8.4 containers, 100k rows x 20 columns, dart run, median of 3:
| Driver | Rows | Network + decode | Extra row copy | Longest event-loop stall during it |
|---|---|---|---|---|
| PostgreSQL | 5,000 | 21-22 ms | 1-3 ms (row.toList) |
0 ms |
| PostgreSQL | 50,000 | 257-271 ms | 10-19 ms | 0-2 ms |
| MySQL | 5,000 | 31-38 ms | 2-5 ms (colAt) |
4-7 ms |
| MySQL | 50,000 | 296-320 ms | 33-42 ms | 7-15 ms |
(The decode itself yields between socket chunks: the PostgreSQL driver blocks the event loop for 0-2 ms even at 50k rows, so moving the driver into a worker isolate would not remove a visible hitch; it only adds connect cost and a result hand-off. Not recommended.)
Solution
Let the driver loop append into column builders (int / double / string / generic with a null bitmap) as rows arrive, deciding the kind from the first rows and falling back to generic when a value does not fit, instead of collecting List<List<Object?>>. A small ResultColumnsBuilder would be shared by the three drivers and by #1548's sampled detection.
Expected: removes the 1-3 ms (5k) / 10-40 ms (50k) copy and the peak memory of the intermediate list, and makes the "decode / pack" step incremental.
Acceptance
- A shared builder used by PostgreSQL, MySQL and SQLite workspaces; existing dataset tests unchanged.
- Mixed-type and NULL-heavy columns still end up as
generic/stringexactly as today (tests). - Peak RSS and time for 5k and 50k rows reported in the PR.
Related: #1548, #1549.
- Dominant language
- Dart
- Stars
- 23
- Forks
- 1
- Avg merge
- 45m
- Merged PRs (30d)
- 529
Getting set up
Starts the project's dev container in your browser, under your own GitHub account.
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from QueryaHub/Querya-Desktop
-
bug P3 ux
Difficulty 2/5 1-3 hours Newbie friendliness 79/100
QueryaHub/Querya-Desktop#1837 ·
Maintainers usually reply within 1 day
-
bug mysql P3
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
QueryaHub/Querya-Desktop#1823 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
QueryaHub/Querya-Desktop#1777 ·
Maintainers usually reply within 1 day
-
enhancement ui
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
QueryaHub/Querya-Desktop#1689 ·
Maintainers usually reply within 1 day
-
ui(dialogs): make destructive query and DML preview dialogs adaptive and prevent table name overflowOpenbug frontend
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
QueryaHub/Querya-Desktop#1642 ·
Maintainers usually reply within 1 day
All issues in QueryaHub/Querya-Desktop
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
fossasia/badgemagic-app#2016 ·
Maintainers usually reply within 1 day
-
direct-code
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
aaronified/fluenough#849 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
PATILYASHH/XPENC#179 · 1 comment ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
AppFlowy-IO/AppFlowy#9094 ·