সর্বাধিক সংখ্যক রেকর্ড পোস্টগ্রেএসএলএল রাখা সম্ভব?


9

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

উত্তর:


12

আপনি আপনার পছন্দসই সারি নম্বর বজায় রাখতে একটি ট্রিগার সংজ্ঞায়িত করতে পারেন:

CREATE OR REPLACE FUNCTION trf_keep_row_number_steady()
RETURNS TRIGGER AS
$body$
BEGIN
    -- delete only where are too many rows
    IF (SELECT count(id) FROM log_table) > rownum_limit
    THEN 
        -- I assume here that id is an auto-incremented value in log_table
        DELETE FROM log_table
        WHERE id = (SELECT min(id) FROM log_table);
    END IF;
END;
$body$
LANGUAGE plpgsql;

CREATE TRIGGER tr_keep_row_number_steady 
AFTER INSERT ON log_table
FOR EACH ROW EXECUTE PROCEDURE trf_keep_row_number_steady();

এটি সম্ভবত সেরা পারফর্মিং বিকল্প নয়, তবে একবার আপনি সীমাতে পৌঁছে গেলে, এটি কখনই ছাড়িয়ে যাবে না। যদি ওঠানামার জন্য জায়গা থাকে তবে আপনি পর্যায়ক্রমে সারি নম্বরটি পরীক্ষা করতে পারেন এবং শুরু থেকে অতিরিক্ত সারিগুলি মুছতে পারেন।

সম্পাদনা: পার্টিশন করার চেয়ে আপনার যদি সত্যিই বড় লগ থাকে (মাসে এক মিলিয়ন বলুন)তবে সহজ সমাধান হতে পারে। তারপরে আপনি কেবল অপ্রয়োজনীয় টেবিলগুলি (যেখানে বলুনmax(timestamp) < CURRENT_DATE - 1 year) ফেলে দিতে পারেন। আপনি আপনার টাইমস্ট্যাম্প (বা উত্পন্ন তারিখ) ব্যাপ্তি বিভাজনের শর্ত হিসাবে ব্যবহার করতে পারেন।

তবে পুরানো লগগুলি বাতিল করার আগে সাবধান হন। আপনি কি এগুলি কখনই প্রয়োজন হবে না তা নিশ্চিত?


আমরা পর্যায়ক্রমে এটি সম্পাদন করতে পারি, এবং আমরা নিশ্চিত যে টেবিলটি এটির প্রয়োজন পর্যাপ্ত পরিমাণে
উঠলে

আমিও আশা করছিলাম যে পোস্টগ্র্যাসগুলি বলতে পারে যে কোনটি নিজেই বড় ছিল, তবে আমাদের আইডি না থাকলে এটি আমাদের তারিখের তৈরি টাইমস্ট্যাম্প ক্ষেত্রটি ব্যবহার করতে পারে "2012-06-22 17: 17: 52.692514"
ঝারউড

@ ঝারউড - আমার উত্তর সম্পাদনা করেছেন আপনার আরও বিশদ বিবরণ প্রয়োজন হলে আমাকে বলুন।
dezso

2
পার্টিশনের পরামর্শে +1। আপনি যদি প্রতিবার টেবিলটি স্ক্যান করার চূড়ান্ত ওভারহেড ছাড়াই একটি গণনা নিয়ে যেতে চান তবে আপনি একটি "নিয়ন্ত্রণ" সারণীতে একটি গণনা বজায় রাখতে ট্রিগারগুলি ব্যবহার করতে পারেন এমন একটি অনুমানের জন্য pg_class.reltuples ব্যবহার করতে পারেন।
কেজিগ্রিটন

4

আমি আরও জেনেরিক, টেবিল স্বতন্ত্র ফাংশন তৈরি করেছি।

CREATE OR REPLACE FUNCTION keep_row_number_steady()
RETURNS TRIGGER AS
$body$
DECLARE
    tab text;
    keyfld text;
    nritems INTEGER;
    rnd DOUBLE PRECISION;
BEGIN
    tab := TG_ARGV[0];
    keyfld := TG_ARGV[1];
    nritems := TG_ARGV[2]; 
    rnd := TG_ARGV[3];

    IF random() < rnd
    THEN 
        EXECUTE(format('DELETE FROM %s WHERE %s < (SELECT %s FROM %s ORDER BY %s DESC LIMIT 1 OFFSET %s)', tab, keyfld, keyfld, tab, keyfld, nritems));
    END IF;
    RETURN NULL;
END;
$body$
LANGUAGE plpgsql;

CREATE TRIGGER log_table_keep_row_number_steady_trigger
AFTER INSERT ON log_table
FOR EACH STATEMENT EXECUTE PROCEDURE keep_row_number_steady('log_table', 'id', 1000, 0.1);

ফাংশনটি 4 পরামিতি নেয়:

  • ট্যাব: টেবিলের নাম
  • keyfld: সংখ্যাসূচক, প্রগতিশীল কী ক্ষেত্র
  • নাইট্রাম: ধরে রাখতে আইটেমের সংখ্যা
  • rnd: এলোমেলো সংখ্যা, 0 থেকে 1; এটি যত বড়, তত ঘন ঘন সারণী পরিষ্কার করা হবে (0 = কখনই নয়, 1 = সর্বদা, 0.1 = 10% বার)

আপনি একই ক্রিয়াকলাপটিতে কল করতে চান এমন কতটি ট্রিগার তৈরি করতে পারবেন।

আশাকরি এটা সাহায্য করবে.


0

আমি এই প্রকল্পটি তৈরি করেছি এবং এটি পিজি এজেন্ট (বা উইন্ডোজ জব বা ক্রোন জব নির্ভর করে) থেকে চালাচ্ছি। আমার আরও সারি থাকতে পারে, এটি আমার লগ টেবিলটি খুব বড় রাখে না। একটি ট্রিগার ওভারহেড সংরক্ষণ করুন।

CREATE or replace FUNCTION activitylogcleanup(_MaxRows int) RETURNS void
    LANGUAGE plpgsql
    AS $$
DECLARE
   minid    int;
BEGIN
    SELECT logid into minid FROM activitylogapplication 
     order by logid desc limit 1 OFFSET _MaxRows;

    if not found then 
        return;
    END IF; 

    Delete from activitylogapplication where logid < minid;
END;
$$;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.