Tôi đang cố gắng tìm ra cách tốt nhất, (có thể không quan trọng trong trường hợp này) để tìm các hàng của một bảng, dựa trên sự tồn tại của một lá cờ, và một id quan hệ trong một hàng trong một bảng khác.Tối ưu hóa truy vấn SQLite3 tham gia vs subselect
đây là các lược đồ:
CREATE TABLE files (
id INTEGER PRIMARY KEY,
dirty INTEGER NOT NULL);
CREATE TABLE resume_points (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
scan_file_id INTEGER NOT NULL);
Tôi đang sử dụng SQLite3
có tập tin bảng sẽ rất lớn, 10K-5M hàng thường. các resume_points sẽ nhỏ < 10K với chỉ 1-2 scan_file_id
biệt 's
nên suy nghĩ đầu tiên của tôi là:
select distinct files.* from resume_points inner join files
on resume_points.scan_file_id=files.id where files.dirty = 1;
một đồng nghiệp đề nghị chuyển join xung quanh:
select distinct files.* from files inner join resume_points
on files.id=resume_points.scan_file_id where files.dirty = 1;
sau đó Tôi nghĩ rằng kể từ khi chúng tôi biết rằng số lượng khác biệt của scan_file_id
sẽ rất nhỏ, có lẽ một subselect sẽ là tối ưu (trong trường hợp hiếm hoi này):
select * from files where id in (select distinct scan_file_id from resume_points);
kết quả đầu ra explain
có các hàng sau: 42, 42 và 48 tương ứng.
Điều này tùy thuộc vào dữ liệu và phần cứng của bạn. Bạn phải tự mình đo lường điều này. –
Bạn đã bỏ lỡ và files.dirty = 1 trên truy vấn cuối cùng – eglasius