आप हमेशा अपनी "भौतिक दृष्टि" के रूप में अपनी टेबल को लागू कर सकते हैं। MATERIALIZED VIEW
पोस्टग्रेज 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
स्टेटमेंट का उपयोग सीधे करें, बिना क्रिएट किए VIEW
।)
फिर, आपके उपयोग के मामले के अज्ञात विवरण के आधार पर, आप मैन्युअल रूप से DELETE
/ UPDATE
/ INSERT
बदल सकते हैं ।
आपकी तालिका के लिए डेटा-संशोधित CTE के साथ एक बुनियादी DML कथन है :
करने के लिए किसी और की कोशिश करता मान लिया जाये कि लिखने के लिए 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
। इसे कवर करने के लिए, आपको पूरी तालिका पर विचार करने की आवश्यकता है। यह सब सटीक आवश्यकताओं पर निर्भर करता है।