Câu trả lời là: indexing
Hãy tưởng tượng rằng tôi có một cuốn từ điển và một người nào đó mang lại cho tôi một nhiệm vụ để tìm 5000 từ trong đó. Nhiệm vụ này sẽ đưa tôi vài giờ.
Nhưng bây giờ hãy tưởng tượng rằng từ điển này chưa được phân loại. Tôi phải mất nhiều năm để tìm tất cả những từ này trong đó.
Máy tính nhanh hơn và cho nhiệm vụ đầu tiên nó chỉ cần mili giây trong khi nhiệm vụ thứ hai vẫn còn vài giây.
Tại sao truy vấn đầu tiên quá chậm?
Điều này là do có INNER JOIN
và được thực hiện trên cột không lập chỉ mục.
Tại sao truy vấn thứ hai quá nhanh?
Điều này là do có truy vấn phụ. Truy vấn con này được thực hiện thành bảng tạm thời và chỉ mục được tạo cho cột nối. Vì vậy, bạn không tham gia ngay bây giờ với bảng B chưa lập chỉ mục nhưng với bảng tạm thời được lập chỉ mục. HSQLDB tạo ra việc lập chỉ mục này trên bảng tạm thời để làm cho nó dễ dàng hơn để tham gia. Ngay cả khi bạn thay đổi tham gia điều kiện phức tạp hơn (ví dụ: A.X = B.Y + 2*B.Z
) truy vấn này sẽ vẫn nhanh. Điều này có nghĩa là HSQLDB tạo chỉ mục trên biểu thức được sử dụng trong điều kiện kết nối.
Bạn có thể kiểm tra phiên bản thứ ba: 'SELECT * FROM A INNER JOIN B ON A.X = B.Y AND B.Z = 1'? –
@ JoëlSalamin Điều này có khoảng thời gian thực hiện tương tự như phiên bản chậm đầu tiên. – user3726374
Nó có thể được gây ra bởi thực tế là 'B.Y' không được lập chỉ mục. Bạn có thể thử phiên bản khác này và cho tôi biết nếu có một hiệu suất đạt được/mất: 'SELECT * TỪ A INNER JOIN (SELECT * FROM B WHERE BZ = 1) ON AX = BY ' –