2011-01-10 4 views
11

Tôi bắt đầu một ứng dụng với Hibernate 3.2 và PostgreSQL 8.4. Tôi có một số trường byte[] được ánh xạ là @Basic (= PG bytea) và các trường khác đã được ánh xạ dưới dạng @Lob (= PG đối tượng lớn). Tại sao mâu thuẫn? Bởi vì tôi là một Noob Hibernate.PostgreSQL: BYTEA vs OID + Đối tượng lớn?

Bây giờ, các trường đó tối đa là 4 Kb (nhưng trung bình là 2-3 kb). Tài liệu PostgreSQL đã đề cập rằng LOs là tốt khi các trường lớn, nhưng tôi không thấy ý nghĩa 'lớn'.

Tôi đã nâng cấp lên PostgreSQL 9.0 bằng Hibernate 3.6 và tôi bị kẹt để thay đổi chú thích thành @Type(type="org.hibernate.type.PrimitiveByteArrayBlobType"). Lỗi này đã đưa ra một vấn đề tương thích tiềm năng, và cuối cùng tôi phát hiện ra rằng các đối tượng lớn là một nỗi đau để đối phó với, so với một lĩnh vực bình thường.

Vì vậy, tôi đang nghĩ đến việc thay đổi tất cả thành bytea. Nhưng tôi lo ngại rằng các lĩnh vực bytea được mã hóa trong Hex, do đó, có một số chi phí trong mã hóa và giải mã, và điều này sẽ làm tổn thương hiệu suất.

Có điểm chuẩn tốt về hiệu suất của cả hai loại này không? Bất kỳ ai đã thực hiện công tắc và thấy sự khác biệt?

Trả lời

5

Về cơ bản, có những trường hợp có ý nghĩa. bytea là đơn giản và thường được ưa thích. Libients của khách hàng cung cấp cho bạn giải mã, do đó, đó không phải là vấn đề.

Tuy nhiên, LOB có một số tính năng gọn gàng, chẳng hạn như khả năng tìm kiếm trong chúng và coi LOB là luồng byte thay vì mảng byte.

"Lớn" có nghĩa là "Đủ lớn bạn không muốn gửi cho khách hàng cùng một lúc". Về mặt kỹ thuật, Bytea được giới hạn với 1GB nén và một thùy được giới hạn 2GB nén, nhưng thực sự bạn nhấn giới hạn khác đầu tiên anyway. Nếu nó đủ lớn bạn không muốn nó trực tiếp trong bộ kết quả của bạn và bạn không muốn gửi nó cho khách hàng cùng một lúc, hãy sử dụng LOB.

4

Nhưng tôi lo ngại rằng bytea lĩnh vực được mã hóa trong Hex

bytea đầu vào có thể ở hex hoặc thoát khỏi định dạng, đó là sự lựa chọn của bạn. Lưu trữ sẽ giống nhau. Kể từ phiên bản 9.0, mặc định đầu ra là hex, nhưng bạn có thể thay đổi điều này bằng cách chỉnh sửa thông số bytea_output.

Tôi chưa thấy bất kỳ điểm chuẩn nào.

+0

Ngoài ra nó không được lưu trữ dưới dạng hex và tôi nghĩ libpq (và thậm chí cả giao thức) có giao diện truyền nhị phân của cả hai. –

1

Tôi không có so sánh các đối tượng lớn và tiện lợi, nhưng lưu ý rằng việc chuyển sang định dạng đầu ra hex trong 9.0 cũng được thực hiện vì nó nhanh hơn mã hóa tùy chỉnh trước đó. Theo như mã hóa văn bản của dữ liệu nhị phân đi, bạn có thể sẽ không nhận được nhanh hơn nhiều so với những gì hiện tại đang có.

Nếu điều đó không đủ tốt cho bạn, bạn có thể xem xét sử dụng giao thức nhị phân giữa máy khách và máy chủ PostgreSQL. Sau đó, bạn về cơ bản có được những thứ trực tiếp từ đĩa, giống như các đối tượng lớn. Tôi không biết liệu JDBC PostgreSQL có hỗ trợ điều đó chưa, nhưng tìm kiếm nhanh không gợi ý gì cả.