পোস্টগ্রেস্কেল-এ কীভাবে দক্ষতার লক্ষ লক্ষ সারি এক টেবিল থেকে অন্য টেবিলটিতে অনুলিপি করবেন?


36

আমার কাছে দুটি ডাটাবেস টেবিল রয়েছে। একটিতে কয়েক মিলিয়ন মিলিয়ন রেকর্ড রয়েছে। যে একটি কল করতে দেয় history। অন্যটি দৈনিক ভিত্তিতে গণনা করা হয় এবং আমি এর সমস্ত রেকর্ড historyএকটিতে অনুলিপি করতে চাই।

আমি যা করেছি তা চালানো ছিল:

INSERT INTO history SELECT * FROM daily

এবং এটি কিছুক্ষণের জন্য কৌশলটি করেছে তবে রেকর্ডের সংখ্যা বাড়তে থাকায় এটি ধীরে ধীরে ধীরে ধীরে আসতে শুরু করে। এখন আমি প্রায় 2 মিলিয়ন রেকর্ড থেকে কপি করা করা প্রয়োজন যে আছে dailyকরার historyএকক অপারেশন এবং এটি সম্পূর্ণ অত্যন্ত দীর্ঘ সময় লাগে।

এক টেবিল থেকে অন্য টেবিলে ডেটা অনুলিপি করার আরও কি আরও কার্যকর উপায় আছে?

উত্তর:


10

আপনি যদি দীর্ঘ সময়ের জন্য ইতিহাস রাখার পরিকল্পনা করেন (অনেক মাস), আমি পার্টিশন বিকল্পগুলির দিকে নজর রাখার পরামর্শ দিই - প্রতিটি দিন বা সপ্তাহের জন্য একটি বিভাজন হতে পারে ইত্যাদি on এটি আপনার ইতিহাসের সারণির অ্যাক্সেস প্যাটার্নের উপরও নির্ভর করে (আপনি কি তারিখ জুড়ে ডেটা অ্যাক্সেস করে এমন কোয়েরি চালান? আপনি কি অনেকগুলি সংহতকরণ ইত্যাদি করেন)। সমষ্টি / সংক্ষিপ্তসারগুলি সঞ্চয় করার জন্য বস্তুগত দর্শনগুলি দেখুন। http://www.postgresql.org/docs/9.3/static/ddl-partitioning.html http://www.postgresql.org/docs/9.3/static/sql-creatematoryizedview.html


উত্তর করার জন্য ধন্যবাদ. মনে হচ্ছে একমাত্র রাস্তা যেতে হবে। আমাকে কয়েক মাসের মধ্যে ডেটা বিভক্ত করতে হবে এবং এভাবে পুনরায় সূচি তৈরি করতে হবে (যেহেতু সূচকের পুনর্জন্ম এখানে একটি সমস্যা ছিল) খুব দ্রুত।
মিলোভান জোগোভিচ

16

টেবিলটি সিএসভি ফর্ম্যাটে ফেলে দিন

COPY table TO '/tmp/table.csv' DELIMITER ',';

COPY কমান্ডটি ব্যবহার করুন যা বিপুল পরিমাণে তথ্যের জন্য কার্যকর।

COPY table FROM '/tmp/table.csv' DELIMITER ',';

আরও তথ্যের জন্য http://www.postgresql.org/docs/current/static/sql-copy.html এ পোস্টগ্র্যাগ ডক্স পরীক্ষা করুন


1
এটি এখনও খুব, খুব ধীরগতিতে চলছে ... সম্ভবত এত বিশাল সূচকটি পুনর্নির্মাণের জন্য এটি কিছু করতে হবে? historyসারণীতে 160 মিলিয়ন সারি রয়েছে এবং আমরা আরও 3 মিলিয়ন সারি যুক্ত করছি।
মিলোভান জোগোভিচ

2
আপনার মধ্যে একটি খালি টেবিল পূর্ণ করছে, বা ইতিমধ্যে বিদ্যমান থেকে আরও সারি যুক্ত করা হচ্ছে, নন-ক্লাস্টারযুক্ত সূচকগুলি ফেলে রাখা এবং স্থানান্তর সম্পূর্ণ হওয়ার পরে এগুলি পুনরায় তৈরি করা সাধারণত কার্যকর (যদি সারণীতে সারণির সক্রিয় ব্যবহার না থাকে তবে) )
ডেভিড স্পিলিট

বিটিডব্লিউ, এটি কি এক বন্ধ অপারেশন বা এটি নিয়মিত আপনাকে কিছু করতে হবে? যদি এটি নিয়মিতভাবে হয় তবে আমার মনে হয় যে আপনি ট্রিগার তৈরি করেছেন যাতে আপনাকে প্রতিবার এই অগ্নিপরীক্ষার মধ্য দিয়ে যেতে হবে না।
ফ্যাবরিজিও মাজনি

@ ফ্যাব্রিজিও মজযোনি - এটি নির্দিষ্ট সময়ে প্রতিদিন ভিত্তিতে সঞ্চালন করতে হবে (টাইমে স্ন্যাপশট গ্রহণের সময়)।
মিলোভান জোগোভিচ

@ ডেভিডস্পিলিট - সত্যই! সূচকগুলি বাদ দেওয়া খুব তাড়াতাড়ি আমদানি করে তোলে (উপরে আমার উত্তর দেখুন) তবে সূচি পুনরুদ্ধার করতে কয়েক ঘন্টা সময় লাগে (যেহেতু ডাটাবেসে আমার 160M সারি রয়েছে) ..
মিলোভান জোগোভিচ

13

সমস্যাটি সূচকের সাথে ছিল। historyটেবিল 160M সূচীবদ্ধ সারি ছিল। হয় চালানো COPY FROMবা INSERT INTO .. SELECTসারি সন্নিবেশ না করে সূচী আপডেট করতে অনেক সময় নিচ্ছিল। আমি যখন সূচকগুলি অক্ষম করি তখন এটি 10 ​​সেকেন্ডের মধ্যে 3 এম সারি আমদানি করে। এখন আমার বড় টেবিলটির পুনর্নির্মাণের দ্রুত উপায় খুঁজে বের করা উচিত।


3
এমনকি আপনার কি কোনও ইতিহাসের টেবিলে সূচি দরকার?
শার্লক

2
কনক্যুরেন্টলি কীওয়ার্ডটি ব্যবহার করে সূচকটি যুক্ত করুন
আকভেল

10

আপনি পিএসকিএল সরঞ্জামটি ব্যবহার করতে পারেন , আমি নিম্নলিখিত হিসাবে দক্ষ হতে পারি,

psql -h ${DAILY_HOST_IP} -p ${PG_PORT} ${DB_NAME} ${USER_NAME} -c "copy daily to stdout " | psql -h ${HISTORY_HOST_IP} -p ${PG_PORT} ${DB_NAME} ${USER_NAME}  -c "copy history from stdin"

এছাড়াও আপনি একটি শেল স্ক্রিপ্ট লিখতে পারেন।


মধ্যবর্তী ফাইল ছাড়াই দুর্দান্ত সমাধান। খুব দ্রুত, আমি নিয়মিত ডিস্ক এবং নেটওয়ার্ক ফাইল সিস্টেমের মধ্যে 1h20 (সূচি ছাড়াই) একটি 950 মিলিয়ন সারি সারণী অনুলিপি করেছি।
লে ড্রয়েড

3

এটি অবশ্যই আপনার প্রশ্নের সঠিক উত্তর নয়, তবে যদি আপনাকে historyটেবিলটি অ্যাক্সেস করার প্রয়োজন না হয় তবে আপনি পাশাপাশি একটি এসকিউএল ডাম্প তৈরি করতে পারেন:

pg_dump -h host -p port -w -U user db > dump.sql

তারপরে কেউ কোনও gitডিভাইসটি পার্থক্যটি গণনা করতে এবং দক্ষতার সাথে এটি সঞ্চয় করতে ব্যবহার করতে পারে ।

git add dump.sql
git commit -m "temp dump"
git gc --aggressive

এটি দরকারী কারণ একটি ডাটাবেসের বেশিরভাগ অংশ প্রতিদিন পরিবর্তন হবে না। প্রতিদিনের জন্য একটি সম্পূর্ণ অনুলিপি সংরক্ষণের পরিবর্তে, কেউ দু'দিনের মধ্যে পার্থক্য সঞ্চয় করতে পারে।

আপনি crontabএমন একটি কাজ ব্যবহার করতে পারেন যে প্রতিদিন ডাম্প প্রক্রিয়াজাত হয়।

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