13 điểm bởi GN⁺ 2024-12-23 | 3 bình luận | Chia sẻ qua WhatsApp
  • SQLite là một kho lưu trữ dạng hàng được lưu trên đĩa bằng cấu trúc B-tree, và thực thi truy vấn bằng một máy ảo tên là VDBE. Nó không phụ thuộc nền tảng và có thể chạy gần như trong mọi môi trường bằng một luồng đơn
  • Dù là cơ sở dữ liệu cho mục đích tổng quát, nó đặc biệt xuất sắc với các tác vụ OLTP. Năm 2015, các nhà nghiên cứu tại Đại học Buffalo phát hiện rằng phần lớn truy vấn là các phép tra cứu key-value đơn giản và các truy vấn OLAP phức tạp
  • Các nhà nghiên cứu tại Đại học Wisconsin–Madison đã nỗ lực làm cho các truy vấn phân tích nhanh hơn. Họ dùng DuckDB và Star Schema Benchmark (SSB) để so sánh hiệu năng

Nguyên nhân

  • Để xác định vì sao SQLite chậm, họ dùng tùy chọn VDBE_PROFILE để đo số chu kỳ CPU mà từng lệnh của VDBE tiêu tốn.
  • Hai opcode SeekRowIDColumn được xác định là nguyên nhân chính.

Join cơ sở dữ liệu

  • Các cách cơ sở dữ liệu triển khai join gồm nested loop join, hash join và sort-merge join.
  • SQLite dùng loại đơn giản nhất là "nested loop join". Cách này tương tự việc dò tìm trên B-tree nên có chi phí cao.

Tầm quan trọng của tối ưu hóa join

  • Trong phép join, thứ tự của các bảng rất quan trọng. Việc đổi thứ tự có thể giảm mạnh số phép toán. Đây là một bài toán NP-khó.
  • Có hai thuật toán join tốt hơn nested loop join, nhưng hash join tiêu tốn nhiều bộ nhớ, trong khi SQLite chủ yếu chạy trong các môi trường bị giới hạn bộ nhớ.
  • Nhóm nghiên cứu đã dùng bộ lọc Bloom để tăng hiệu quả không gian và khớp với cache line của CPU. Họ thêm hai opcode là FilterFilterAdd.

Kết quả

  • Sau khi tối ưu, trong phân tích chu kỳ CPU, các thanh màu xanh lớn gần như biến mất.
  • SQLite nhanh hơn từ 7 đến 10 lần. Kết quả nghiên cứu này đã được áp dụng vào SQLite v3.38.0.
  • Bộ lọc Bloom phù hợp với cách triển khai đơn giản của SQLite với chi phí bộ nhớ bổ sung tối thiểu và hoạt động bên trong bộ máy truy vấn hiện có

3 bình luận

 
porteleaf 2024-12-24

Kiểm tra phiên bản hiện tại thì hệ thống của tôi đang dùng 3.42.0. Tính đến hiện tại, bản mới nhất là 3.47.2.

 
halfenif 2024-12-24

Có lẽ giờ phải kiểm tra xem mình đang dùng phiên bản SQLite nào rồi.

Thực ra ngoài chuyện này, tôi đang dùng openpyxl để tạo file Excel, nhưng mất khá nhiều thời gian, nên chắc cũng phải tìm xem có thư viện nào khác không.

 
savvykang 2024-12-24

Có lẽ nên thử profiling chứ nhỉ?