Bạn luôn có thể triển khai bảng của riêng mình dưới dạng "khung nhìn cụ thể". Đó là những gì bạn phải làm trước đây MATERIALIZED VIEW
được thực hiện trong Postgres 9.3.
Chẳng hạn, bạn có thể tạo một đồng bằng VIEW
:
CREATE VIEW graph_avg_view AS
SELECT xaxis, AVG(value) AS avg_val
FROM graph
GROUP BY xaxis;
Và cụ thể hóa kết quả một lần hoặc bất cứ khi nào bạn cần bắt đầu lại:
CREATE TABLE graph_avg AS
SELECT * FROM graph_avg_view
(Hoặc sử dụng SELECT
câu lệnh trực tiếp mà không cần tạo VIEW
.)
Sau đó, tùy thuộc vào chi tiết không được tiết lộ về trường hợp sử dụng của bạn, bạn có thể DELETE
/ UPDATE
/ INSERT
thay đổi theo cách thủ công.
Một câu lệnh DML cơ bản với các CTE sửa đổi dữ liệu cho bảng của bạn như sau:
Giả sử không ai cố gắng khác để ghi tới graph_avg
đồng thời (đọc là không có vấn đề):
WITH del AS (
DELETE FROM graph_avg t
WHERE NOT EXISTS (SELECT 1 FROM graph_avg_view v WHERE v.xaxis = v.xaxis);
)
, upd AS (
UPDATE graph_avg t
FROM graph_avg_view v
WHERE t.xaxis = v.xaxis
AND t.avg_val <> v.avg_val
)
INSERT INTO graph_avg t
SELECT *
FROM graph_avg_view v
LEFT JOIN graph_avg t USING (xaxis)
WHERE t.xaxis IS NULL;
Nhưng điều này có lẽ nên được tối ưu hóa.
Công thức cơ bản:
- Thêm một
timestamp
cột với mặc định now()
vào bảng cơ sở của bạn. Hãy gọi nó là ts
.
- Nếu bạn có các bản cập nhật, hãy thêm một kích hoạt để đặt dấu thời gian hiện tại với mỗi bản cập nhật thay đổi
xaxis
hoặc value
.
Tạo một bảng nhỏ để ghi nhớ dấu thời gian của ảnh chụp mới nhất của bạn. Hãy gọi nó là mv
:
CREATE TABLE mv (
tbl text PRIMARY KEY
, ts timestamp NOT NULL DEFAULT '-infinity'
); -- possibly more details
Tạo chỉ mục một phần, nhiều màu này:
CREATE INDEX graph_mv_latest ON graph (xaxis, value)
WHERE ts >= '-infinity';
Sử dụng dấu thời gian của ảnh chụp nhanh cuối cùng làm vị ngữ trong các truy vấn của bạn để làm mới ảnh chụp nhanh với việc sử dụng chỉ mục hoàn hảo.
Khi kết thúc giao dịch, bỏ chỉ mục và tạo lại nó bằng dấu thời gian giao dịch thay thế dấu thời gian trong vị từ chỉ mục (ban đầu '-infinity'
), mà bạn cũng lưu vào bảng của mình. Tất cả mọi thứ trong một giao dịch.
Lưu ý rằng chỉ mục một phần là tuyệt vời để bao gồm INSERT
và UPDATE
hoạt động, nhưng không DELETE
. Để bao quát điều đó, bạn cần xem xét toàn bộ bảng. Tất cả phụ thuộc vào yêu cầu chính xác.