Tôi đã có truy vấn chứa truy vấn phụ luôn gây ra QUÉT của một bảng rất lớn dẫn đến thời gian truy vấn kém.Tại sao truy vấn con gây ra quá trình quét khi danh sách tĩnh không?
Đây là câu hỏi tôi đang sử dụng:
SELECT PersonId
FROM person
WHERE PersonId IN (
SELECT PersonId
FROM relationship
WHERE RelatedToPersonId = 12270351721
);
Kế hoạch truy vấn được báo cáo là:
SCAN TABLE person (~100000 rows)
EXECUTE LIST SUBQUERY 1
SEARCH TABLE relationship USING INDEX relationship_RelatedToPersonId_IDX (RelatedToPersonId=?) (~10 rows)
Các truy vấn cùng với một danh sách tĩnh (tương đương với kết quả của subquery) :
SELECT PersonId
FROM person
WHERE PersonId IN (12270351727,12270351730,12270367969,12387741400);
Và kế hoạch truy vấn cho điều đó:
SEARCH TABLE person USING COVERING INDEX sqlite_autoindex_person_1 (PersonId=?) (~5 rows)
EXECUTE LIST SUBQUERY 1
Tại sao truy vấn đầu tiên sẽ nhắc quét nếu lần truy vấn thứ hai không?
Nếu tập dữ liệu từ truy vấn phụ của bạn nhỏ thì bảng tạm thời có thể hoạt động. Một cái gì đó như: Chọn Personid From (SELECT PersonId FROM relationship WHERE RelatedToPersonId = 12270351721); – DallinDyer
Tôi đã thử một bảng tạm thời và nó vẫn tạo ra một lần quét. – goto10
Có thể 'PersonId' tồn tại trong' mối quan hệ' nếu không có hàng trong 'người' không? Nếu không, không phải truy vấn phụ (có thể với một 'khác biệt') thỏa mãn toàn bộ truy vấn? –