Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

perf(results): build typed columns directly from the driver stream instead of collecting List<List<Object?>> first

Đang mở
#1,552 2 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
42/100
Loại issue
Tính năng
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
dart, mysql, postgresql, sqlite
Lĩnh vực
database, performance

Hướng nghiên cứu

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.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

backend core enhancement P3 performance
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 (all ResultSetRows 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 / string exactly as today (tests).
  • Peak RSS and time for 5k and 50k rows reported in the PR.

Related: #1548, #1549.

Ngôn ngữ chính
Dart
Star
23
Fork
1
Merge trung bình
31 phút
Pull request đã merge (30 ngày)
570

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của QueryaHub/Querya-Desktop

Tất cả issue của QueryaHub/Querya-Desktop

Issue tương tự

Thêm issue về Dart

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.