คุณสามารถใช้การแสดงตารางของคุณเองเป็น "มุมมองที่ปรากฏขึ้น" ได้เสมอ นั่นคือสิ่งที่คุณต้องทำก่อนMATERIALIZED VIEW
นำไปใช้ใน Postgres 9.3 ไม่ว่าจะด้วยวิธีใด
ตัวอย่างเช่นคุณสามารถสร้างธรรมดาVIEW
:
CREATE VIEW graph_avg_view AS
SELECT xaxis, AVG(value) AS avg_val
FROM graph
GROUP BY xaxis;
และแสดงผลลัพธ์โดยรวมเพียงครั้งเดียวหรือเมื่อใดก็ตามที่คุณต้องการเริ่มต้นใหม่:
CREATE TABLE graph_avg AS
SELECT * FROM graph_avg_view
(หรือใช้SELECT
คำสั่งโดยตรงโดยไม่ต้องสร้าง a VIEW
.)
จากนั้นขึ้นอยู่กับรายละเอียดที่ไม่เปิดเผยของกรณีการใช้งานของคุณคุณสามารถDELETE
/ UPDATE
/ INSERT
เปลี่ยนแปลงด้วยตนเอง
คำสั่ง DML พื้นฐานพร้อม CTE ที่แก้ไขข้อมูลสำหรับตารางของคุณตามที่เป็น :
สมมติว่าไม่มีใครพยายามเขียนไปgraph_avg
พร้อม ๆ กัน (การอ่านไม่มีปัญหา):
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;
แต่สิ่งนี้น่าจะเหมาะสมที่สุด
สูตรพื้นฐาน:
- เพิ่ม
timestamp
คอลัมน์ที่มีค่าเริ่มต้นnow()
ลงในตารางฐานของคุณ ts
ขอเรียกว่า
- หากคุณมีการปรับปรุงเพิ่มการเรียกการตั้งค่าการประทับเวลาในปัจจุบันมีการปรับปรุงที่เปลี่ยนแปลงทุกอย่างใดอย่างหนึ่งหรือ
xaxis
value
สร้างตารางเล็ก ๆ เพื่อจดจำการประทับเวลาของสแน็ปช็อตล่าสุดของคุณ เรียกมันว่าmv
:
CREATE TABLE mv (
tbl text PRIMARY KEY
, ts timestamp NOT NULL DEFAULT '-infinity'
); -- possibly more details
สร้างดัชนีหลายส่วนบางส่วนนี้:
CREATE INDEX graph_mv_latest ON graph (xaxis, value)
WHERE ts >= '-infinity';
ใช้การประทับเวลาของสแน็ปช็อตสุดท้ายเป็นเพรดิเคตในแบบสอบถามของคุณเพื่อรีเฟรชสแน็ปช็อตด้วยการใช้ดัชนีที่สมบูรณ์แบบ
ในตอนท้ายของการทำธุรกรรมให้วางดัชนีและสร้างใหม่ด้วยการประทับเวลาของธุรกรรมแทนที่การประทับเวลาในภาคแสดงดัชนี (เริ่มแรก '-infinity'
) ซึ่งคุณจะบันทึกลงในตารางของคุณด้วย ทุกอย่างในหนึ่งธุรกรรม
หมายเหตุว่าดัชนีบางส่วนเป็นที่ดีที่ปกINSERT
และUPDATE
การดำเนินงาน DELETE
แต่ไม่ได้ เพื่อให้ครอบคลุมนั้นคุณจะต้องพิจารณาทั้งตาราง ทุกอย่างขึ้นอยู่กับข้อกำหนดที่แน่นอน