Tôi đang sử dụng hỗ trợ Hibernate cho chiến lược thừa kế TABLE_PER_CLASS. Chức năng khôn ngoan nó hoạt động tốt. Bất cứ khi nào truy vấn đa hình được cấp Hibernate tạo ra một SQL có chứa "union all" cho hai lớp bê tông của tôi Một & B. tạo SQL có định dạng sau:Cách khắc phục các vấn đề về hiệu suất do SQL tạo ra của lớp con công đoàn trong Hibernate
select C1, C2, C3 from (
select C1, C2, C3 from ClassA
union all
select C1, C2, C3 from ClassB
)
where
C1 == <value>
order by C2
limit 100
Vấn đề phương pháp này bị hiệu suất thực sự tồi tệ trên DB bên. Có tính đến cột C1 là thuộc tính được chia sẻ của ClassA và ClassB (bắt nguồn từ bố mẹ trừu tượng) Hibernate có thể chèn mệnh đề where trong cả hai lựa chọn phụ và cải thiện đáng kể hiệu suất. Ví dụ:
select C1, C2, C3 from (
select C1, C2, C3 from ClassA where C1 == <value>
union all
select C1, C2, C3 from ClassB where C1 == <value>
)
order by C2
limit 100
Một số tối ưu hóa cũng có thể được thực hiện trên giới hạn. Tôi đang sử dụng API tiêu chí Hibernate trong lớp DAO của tôi.
Trình chặn, onPrepareStatment() không thể được sử dụng vì đối số không hiển thị. Sử dụng phân vùng và có thể các tùy chọn khác trên DB hiện nằm ngoài phạm vi vì chúng tôi muốn tránh tối ưu hóa DB cụ thể ở giai đoạn này của công việc.
Bất kỳ ý tưởng nào về cách thao tác ngủ đông để cải thiện hiệu suất?
Bạn có thể rõ ràng hơn không - cho truy vấn SQL được tạo ngay bây giờ và biến thể sẽ mang lại hiệu suất tốt hơn. – gkamal
Cơ sở dữ liệu nằm bên dưới là gì? Tôi đoán nó sẽ không được Oracle, vì nó thường đẩy xuống predicates vào subselects và thành công đoàn ... Có 'C1' có một chỉ số thích hợp trong cả hai bảng? –
C1 có chỉ mục trên cả hai bảng. Chúng tôi có thể sẽ hỗ trợ nhiều DB, trong đó có Derby (Pure java). Kết quả là trọng tâm hiện tại là xác định một lược đồ sẽ mang lại hiệu suất tốt nhất cho tất cả các Cơ sở dữ liệu. – user1392212