2012-05-13 27 views
5

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?

+0

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

+0

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

+0

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

Trả lời

0

Tôi muốn có hiệu suất cơ sở dữ liệu cao hơn tôi khuyên bạn không nên sử dụng các truy vấn bảng-pr và nhiều hoặc các truy vấn đa hình lớn. Một cột phân biệt đối xử thường sẽ tốt hơn.

Lưu ý rằng bạn có thể kết hợp bảng-pr-class với discrimantor-cột nếu bạn có nhiều hơn hai cấp trong lớp của bạn khó xử.

+0

Cảm ơn câu trả lời. Tuy nhiên, tôi đang cố gắng để tránh bảng lớn mà 99% thời gian 90% dữ liệu của nó là không cần thiết bằng cách tách các bảng. – user1392212

Các vấn đề liên quan