CÓ bạn có thể !! Giải pháp phải dễ dàng, an toàn và hiệu quả ...
Tôi mới sử dụng postgresql, nhưng có vẻ như bạn có thể tạo các cột được tính toán bằng cách sử dụng chỉ mục biểu thức , được ghép nối với một chế độ xem (chế độ xem là tùy chọn, nhưng làm cho cuộc sống dễ dàng hơn một chút).
Giả sử tính toán của tôi là md5(some_string_field)
, sau đó tôi tạo chỉ mục là:
CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));
Bây giờ, bất kỳ truy vấn nào hoạt động MD5(some_string_field)
sẽ sử dụng chỉ mục thay vì tính toán nó từ đầu. Ví dụ:
SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);
Bạn có thể kiểm tra điều này với giải thích .
Tuy nhiên tại thời điểm này, bạn đang dựa vào những người sử dụng bảng biết chính xác cách tạo cột. Để làm cho cuộc sống dễ dàng hơn, bạn có thể tạo một VIEW
phiên bản tăng cường của bảng gốc, thêm giá trị được tính toán dưới dạng một cột mới:
CREATE VIEW some_table_augmented AS
SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;
Bây giờ bất kỳ truy vấn nào sử dụng some_table_augmented
sẽ có thể sử dụng some_string_field_md5
mà không cần lo lắng về cách hoạt động của nó..chúng chỉ có được hiệu suất tốt. Chế độ xem này không sao chép bất kỳ dữ liệu nào từ bảng gốc, vì vậy nó rất tốt về bộ nhớ cũng như hiệu suất. Tuy nhiên, lưu ý rằng bạn không thể cập nhật / chèn vào một dạng xem, chỉ vào bảng nguồn, nhưng nếu bạn thực sự muốn, tôi tin rằng bạn có thể chuyển hướng các lần chèn và cập nhật đến bảng nguồn bằng cách sử dụng các quy tắc (Tôi có thể sai ở điểm cuối cùng như Tôi chưa bao giờ tự mình thử).
Chỉnh sửa: có vẻ như nếu truy vấn liên quan đến các chỉ số cạnh tranh, công cụ lập kế hoạch đôi khi có thể không sử dụng biểu thức-chỉ mục nào cả. Sự lựa chọn dường như phụ thuộc vào dữ liệu.