বিশাল টেবিলে সিরিয়াল কলাম যুক্ত করার সর্বাধিক দক্ষ উপায়


10

বিশাল টেবিলটিতে বিগসারিয়াল কলাম যুক্ত করার দ্রুততম উপায় কী ((3 বিল। সারি, ~ 174 গিগাবাইট)?

সম্পাদনা করুন:

  • আমি চাই যে বিদ্যমান সারিগুলির জন্য কলামটি বর্ধিত মান হবে ( NOT NULL)।
  • আমি একটি ফিলিফ্যাক্টর সেট করি নি (যা পূর্ববর্তী ক্ষেত্রে খারাপ সিদ্ধান্তের মতো দেখায়)।
  • ডিস্ক স্পেস নিয়ে আমার কোনও সমস্যা নেই, কেবল এটি যত তাড়াতাড়ি সম্ভব হোক।

উত্তর:


12

কি সমস্যা:

ALTER TABLE foo ADD column bar bigserial;

স্বয়ংক্রিয়ভাবে অনন্য মান দিয়ে পূর্ণ হবে (1 দিয়ে শুরু)।

আপনি যদি প্রতিটি বিদ্যমান সারির জন্য একটি নম্বর চান তবে সারণির প্রতিটি সারি আপডেট করতে হবে । না না?

যদি ডেটা পৃষ্ঠাগুলিতে মৃত টিপলস বা বিনামূল্যে স্থান পুনরায় ব্যবহার করতে না পারে তবে টেবিলটি তার আকারের দ্বিগুণ হয়ে যাবে। FILLFACTORটেবিলের উপরে ছড়িয়ে থাকা 100 এরও কম বা এলোমেলো মৃত টিপলগুলি থেকে অপারেশনের পারফরম্যান্স অনেক উপকার করতে পারে । অন্যথায় আপনি VACUUM FULL ANALYZEপরে চালাতে চান ডিস্কের স্থান পুনরুদ্ধার করতে। যদিও এটি দ্রুত হবে না।

pgstattuple
আপনি এই এক্সটেনশনে আগ্রহী হতে পারেন। এটি আপনাকে আপনার টেবিলগুলিতে পরিসংখ্যান সংগ্রহ করতে সহায়তা করে। মৃত টিপলস এবং বিনামূল্যে স্থান সম্পর্কে সন্ধান করতে:

প্রতি ডেটাবে একবার এক্সটেনশন ইনস্টল করুন:

CREATE EXTENSION pgstattuple;

কল করুন:

SELECT * FROM pgstattuple('tbl');

বিকল্প

যদি আপনি একটি নতুন টেবিল তৈরি করতে সক্ষম হন তবে এটি নির্ভর করে ভিউ, বিদেশী কীগুলি, ...

পুরানো টেবিলের একটি খালি অনুলিপি তৈরি করুন:

CREATE new_tbl AS
SELECT *
FROM   old_tbl
LIMIT  0;

বিগসিরিয়াল কলাম যুক্ত করুন:

ALTER new_tbl ADD column bar bigserial;

পুরানো টেবিল থেকে তথ্য প্রবেশ করুন, স্বয়ংক্রিয়ভাবে বড়সিরিয়াল পূরণ করুন:

INSERT INTO new_tbl
SELECT *    --  new column will be filled with default
FROM   old_tbl
ORDER  BY something; -- or don't order if you don't care: faster

নতুন বিগসিরিয়াল কলামটি INSERT এর SELECT এ অনুপস্থিত এবং এটি স্বয়ংক্রিয়ভাবে তার ডিফল্ট মান দিয়ে পূর্ণ হবে । আপনি সমস্ত কলামের বানান করতে পারেন এবং একই প্রভাব তালিকায় যুক্ত nextval()করতে SELECTপারেন।

আপনি নতুন টেবিলে আপনার সমস্ত ডেটা পেয়েছেন তা নিশ্চিত করুন।
পুরাতন সারণীতে এখন সূচি, সীমাবদ্ধতা, ট্রিগার যুক্ত করুন ।

DROP TABLE old_tbl;
ALTER TABLE new_tbl RENAME TO old_tbl;

সামগ্রিকভাবে বেশ কিছুটা দ্রুত হতে পারে। এটি আপনাকে কোনও ভোঁতা ছাড়াই ভ্যানিলা টেবিল (এবং সূচি) সহ ছেড়ে দেয়।

উইগল রুম হিসাবে আপনার টেবিলের রাজ্যের উপর নির্ভর করে পুরানো টেবিলের আকারের চারপাশে - বিনামূল্যে ডিস্কের স্থান দরকার। টেবিল ফুলে যাওয়ার কারণে আপনার প্রথম সহজ পদ্ধতির সাথে ঠিক তেমন প্রয়োজন হতে পারে। আবার, বিশদগুলি আপনার টেবিলের অবস্থার উপর নির্ভর করে।


3
বিকল্পটি একটি একক লেনদেনে মুড়ুন, এটি আরও দ্রুত হবে। এটি অতিরিক্ত fsyncগুলি
এড়াবে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.