2014-09-30 17 views
5

Tốc độ thực hiện của các truy vấn sau là khác nhau đáng kể. Thứ hai kết thúc các đơn đặt hàng của cường độ nhanh hơn so với người đầu tiên.SQL INNER JOIN tối ưu hóa tự động trong HSQLDB

SELECT * FROM A INNER JOIN B ON A.X=B.Y WHERE B.Z=1 
SELECT * FROM A INNER JOIN (SELECT * FROM B) ON A.X=B.Y WHERE B.Z=1 

Sẽ thật tuyệt nếu ai đó viết lý do tại sao lại như vậy. Cơ sở dữ liệu là HSQLDB với JDBC.

Thông tin bổ sung: Phiên bản HSQLDB là 2.3.2. Và cột A.X được lập chỉ mục nhưng cột B.Y thì không.

+1

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'? –

+0

@ 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

+0

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 ' –

Trả lời

1

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.

+0

Điều này chắc chắn có ý nghĩa. Bạn có thể có bất kỳ tài liệu tham khảo cho những gì bạn mô tả? – user3726374