পোস্টগ্রিজ এসকিউএলে মেটেরালাইজড ভিউটি ক্রমশ রিফ্রেশ করুন


33

পোস্টগ্রিজ এসকিউএল-তে কেবল নতুন বা পরিবর্তিত তথ্যের জন্যই কি কোনও বস্তুগত দৃষ্টিভঙ্গি বাড়ানো সম্ভব?

এই টেবিলটি বিবেচনা করুন এবং বস্তুগত দেখুন:

CREATE TABLE graph (
   xaxis integer NOT NULL,
   value integer NOT NULL,
);

CREATE MATERIALIZED VIEW graph_avg AS 
SELECT xaxis, AVG(value)
FROM graph
GROUP BY xaxis

পর্যায়ক্রমে নতুন মান যুক্ত হয় graphবা বিদ্যমান মান আপডেট হয়। আমি graph_avgআপডেট হওয়া মানগুলির জন্য প্রতি কয়েক ঘন্টা কয়েক ঘন্টা রিফ্রেশ করতে চাই । তবে PostgreSQL 9.3 এ পুরো টেবিলটি রিফ্রেশ হয়েছে। এটি বেশ সময়সাপেক্ষ। পরবর্তী সংস্করণ 9.4 CONCURRENTআপডেটের অনুমতি দেয় তবে এটি এখনও পুরো দর্শন সতেজ করে। শত শত মিলিয়ন সারি সহ, এটি কয়েক মিনিট সময় নেয়।

আপডেট হওয়া ও নতুন মূল্যবোধের ট্র্যাক রাখা এবং কেবলমাত্র আংশিকভাবে রিফ্রেশ করার ভাল উপায় কী?

উত্তর:


22

আপনি সর্বদা আপনার নিজের টেবিলকে "বস্তুগত দৃশ্য" হিসাবে পরিবেশন করতে পারেন। 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পরিবর্তন করতে পারবেন ।

আপনার টেবিলের জন্য ডেটা-মডিফাইং সিটিই সহ একটি বেসিক ডিএমএল বিবৃতিটি হ'ল :

থেকে কেউ কিছু আর চেষ্টা ধরে নেওয়া যাক লেখার জন্য 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। এটি আবরণ করার জন্য, আপনাকে পুরো টেবিলটি বিবেচনা করতে হবে। এটি সব সঠিক প্রয়োজনীয়তার উপর নির্ভর করে।


বস্তুগত দৃষ্টিভঙ্গি সম্পর্কে স্বচ্ছতার জন্য এবং একটি বিকল্প উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ Thank
ব্যবহারকারী 4150760

13

সমকালীন আপডেট (9.4 পোস্টগ্রেস)

আপনি যেমনটি চেয়েছিলেন তেমন কোনও বার্ষিক আপডেট নয়, তবে পোস্টগ্রিস 9.4 নতুন কনট্রেন্ট আপডেট বৈশিষ্ট্য সরবরাহ করে।

দস্তাবেজটির উদ্ধৃতি দিতে ...

পোস্টগ্রেএসকিউএল ৯.৪ এর পূর্বে, বস্তুগত দৃষ্টিভঙ্গি রিফ্রেশ করার অর্থ পুরো টেবিলটি লক করা এবং অতএব এটিকে জিজ্ঞাসা করা কিছু রোধ করা এবং যদি একটি রিফ্রেশটি একচেটিয়া লকটি অর্জন করতে দীর্ঘ সময় নেয় (যখন এটি শেষ করতে এটি ব্যবহারের জন্য অপেক্ষা করে থাকে), এটি ঘুরে ফিরে আসে পরবর্তী প্রশ্নগুলি ধরে রাখে। এটি এখন স্বতন্ত্র কীওয়ার্ড দিয়ে প্রশমিত করা যেতে পারে:

 postgres=# REFRESH MATERIALIZED VIEW CONCURRENTLY mv_data;

বস্তুগত দৃশ্যে যদিও একটি অনন্য সূচকের উপস্থিতি প্রয়োজন। বস্তুগত দৃষ্টিভঙ্গিটি লক না করে পরিবর্তে এটি এর একটি অস্থায়ী আপডেট হওয়া সংস্করণ তৈরি করে, দুটি সংস্করণের তুলনা করে, তারপরে পার্থক্যটি প্রয়োগ করার জন্য বস্তুগত দৃষ্টিভঙ্গির তুলনায় INSERTs এবং DELETEs প্রয়োগ করে। এর অর্থ হল ক্যোয়ারীগুলি আপডেট হওয়ার সময় এখনও বস্তুগত দৃশ্যের ব্যবহার করতে পারে। এর অ-সমবর্তী রূপের বিপরীতে, টিউপসগুলি হিমশীতল হয় না এবং উপরোক্ত উল্লিখিত মোছার কারণে এটি ভ্যাকুয়ামিংয়ের দরকার হয় যা মৃত শৈশবকে পিছনে ফেলে দেবে।

এই সমবর্তী আপডেটটি এখনও একটি সম্পূর্ণ নতুন ক্যোয়ারী (বর্ধিত নয়) সম্পাদন করছে। সুতরাং সংক্ষেপে সামগ্রিক গণনার সময় সাশ্রয় হয় না, এটি আপডেট হওয়ার সময় আপনার বস্তুগত দৃষ্টিভঙ্গিটি ব্যবহারের জন্য অনুপলব্ধ পরিমাণটি হ্রাস করে।


11
আমি নিবিড়ভাবে পড়া না হওয়া পর্যন্ত এক মুহুর্তের জন্য আমি উত্তেজিত ছিলাম। it instead creates a temporary updated version of it...compares the two versions- এর অর্থ অস্থায়ী আপডেট হওয়া সংস্করণটি এখনও একটি সম্পূর্ণ গণনা, তারপরে এটি বিদ্যমান দর্শনে পার্থক্যটি প্রয়োগ করে। তাই মূলত, আমি এখনও সমস্ত গণনা পুনরায় করছি, তবে কেবল অস্থায়ী সারণীতে।
ব্যবহারকারী 4150760

5
আহ, সত্য, CONCURRENTLYসামগ্রিক গণনার সময় সাশ্রয় হয় না, এটি কেবলমাত্র আপনার শারীরিক দৃষ্টিভঙ্গিটির আপডেটের সময় ব্যবহারের জন্য অনুপলব্ধ সময়কে হ্রাস করে।
তুলসী বার্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.