কীভাবে বিশাল পোস্টগ্রিডের টেবিলটি নকল করবেন?


29

আমার কাছে বিশাল পোস্টগ্রিজ টেবিল (10 জিবি ডেটা - 160 এম রেকর্ডস) রয়েছে। সারণি স্থিতিশীল এবং এতে কোন লেখার ক্রিয়াকলাপ নেই। আমি এটিকে সদৃশ করতে চাই, লেখার সম্পাদন করব, এটিকে পুনর্নির্মাণ এবং তারপরে একক দ্রুত লেনদেনের মাধ্যমে পুরানোটিকে মুছুন এবং নতুনটির নতুন নামটি মূল নামকরণ করুন।

এত বিশাল টেবিলটি নকল করার দ্রুততম উপায় কী?

উত্তর:


55

সাধারণত কোনও টেবিলটির নকল করার দ্রুততম উপায়টি হ'ল:

CREATE TABLE table2 AS SELECT * FROM table1;

সমান্তরাল INSERT গুলি দ্রুত হতে পারে তবে কেবল খুব দ্রুত ডিস্কের সাবসিস্টেমের সাথে (যখন ডেটাটি অনেকগুলি ড্রাইভে অন্তর্নিহিত থাকে)। অন্যথায় এটি ধীর হবে।

একবার আপনি সংশোধন করার পরে table2, এটি এর সাথে নতুন নামটি নিতে পারে:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

DROP TABLEকমান্ড যা আপনি কহা করতে পারেন মধ্যে সমবর্তী পাঠকদের প্রভাবিত একটি একচেটিয়া লক, দরকার:

  • DROP অন্যান্য লেনদেনগুলি থেকে টেবিলের যে কোনও মুলতুবি পড়ার অপেক্ষা করবে finish
  • এর মধ্যে সেই টেবিলটি পড়ার চেষ্টা করা যে কোনও নতুন লেনদেনকে এটিকে অপেক্ষায় রাখা হবে, এবং তারপরে মূলটি table1আর বিদ্যমান না থাকায় ব্যর্থ হবে । ত্রুটিটি দেখে মনে হবে "ওআইডি ওডের সাথে সম্পর্ক খুলতে পারে না "

দ্বিতীয় দিক এড়ানোর জন্য, আপনি নামান্তর পারে table1 থেকে old_table1 এটা ড্রপ পরিবর্তে, এবং তারপর শুধুমাত্র পরে লেনদেন, বাইরে এটা ড্রপ যখন এই পাঠকদের এটা দিয়ে করা হয়। সুতরাং উপরের ক্রমটি হয়ে উঠবে:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;

2
ধন্যবাদ মানুষ. এটি হ'ল ধরণের ব্যাখ্যা যা আমি সন্ধান করছিলাম। আবার ধন্যবাদ!
মিলোভান জোগোভিচ

যদি টেবিল 2 এ সূচকগুলি সংজ্ঞায়িত করা হয়, তবে তারা টেবিলটির পুনরায় নামকরণের পরে কি কাজ করবে?
বামাপুকি

1
ইনডেক্স, সীমাবদ্ধতা এবং অক্ষমতা সহ পুরো স্কিমা জন্য এই চেক আউট @BamaPookie wiki.postgresql.org/wiki/Clone_schema
টিমোথি ভোগেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.