পোস্টগ্রিএসকিউএল: মেমরিতে জোর করে ডেটা


32

পোস্টগ্র্রেএসকিউএলকে কোনও নির্দিষ্ট টেবিলটিকে মেমরিতে লোড করতে বাধ্য করার কোনও নিয়মতান্ত্রিক উপায় আছে বা কমপক্ষে এটি ডিস্ক থেকে পড়তে হবে যাতে এটি সিস্টেম দ্বারা ক্যাশে হবে?

উত্তর:


25

মেলিং তালিকাগুলির একটিতে আপনাকে ইন্টারেস্ট করা যেতে পারে , এটির উত্তর টম লেন (মূল দেব) দ্বারা দিয়েছেন:

[..] তবে আমার মতে এমন লোকেরা যারা এলআরইউ ক্যাচিং অ্যালগরিদমের চেয়ে চৌকস বলে মনে করে তারা সাধারণত ভুল হয়। টেবিলটি যদি ভারীভাবে ব্যবহৃত হয় তবে এটি স্মৃতিতে ঠিক থাকবে। যদি এটি একটি এলআরইউ অ্যালগরিদম অনুসারে মেমরির পর্যাপ্ত ভারীভাবে ব্যবহার না করা হয় তবে সম্ভবত মেমরির স্থানটি অন্য কোনও ক্ষেত্রে ব্যয় করা উচিত। [..]

আপনি কোনও এসও প্রশ্নেও ইন্টারেস্টেড হতে পারেন : https://stackoverflow.com/questions/486154/postgresql-temporary-tables এবং সম্ভবত আরও উপযুক্ত https://stackoverflow.com/questions/407006/need-to-load-the -whole-PostgreSQL-ডাটাবেসের-মধ্যে-RAM


1
+1 একই ধারণা অন্যান্য আরডিবিএমএসেও প্রযোজ্য।
gbn

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

35

পোস্টগ্রেস 9.4 অবশেষে সম্পর্কগুলি থেকে ওএস বা ডাটাবেস বাফার ক্যাশে (আপনার পছন্দ অনুসারে) প্রিলোড লোড করতে একটি এক্সটেনশন যুক্ত করেছে:

pg_prewarm

এটি আরও দ্রুত সম্পূর্ণ অপারেটিং পারফরম্যান্সে পৌঁছানোর অনুমতি দেয়।

আপনার ডাটাবেসে একবার চালান ( এখানে বিস্তারিত নির্দেশাবলী ):

CREATE EXTENSION pg_prewarm;

তারপরে কোনও প্রদত্ত সম্পর্কের প্রিলোড করা সহজ। প্রাথমিক উদাহরণ:

SELECT pg_prewarm('my_tbl');

my_tblঅনুসন্ধানের পথে নামযুক্ত প্রথম সারণী সন্ধান করে এবং এটি পোস্টগ্রিস বাফার ক্যাশে লোড করে

বা:

SELECT pg_prewarm('my_schema.my_tbl', 'prefetch');

prefetchঅপারেটিং সিস্টেমটিতে অ্যাসিঙ্ক্রোনাস প্রিফেচ অনুরোধগুলি ইস্যু করে, যদি এটি সমর্থিত হয়, বা অন্যথায় ত্রুটি ছুড়ে দেয়। read অনুরোধকৃত ব্লকের পরিসর পড়বে; বিপরীতে prefetch, এটি সমস্ত প্ল্যাটফর্ম এবং বিল্ডগুলিতে সিঙ্ক্রোনাস এবং সমর্থিত তবে ধীর হতে পারে। bufferডেটাবেস বাফার ক্যাশে ব্লকগুলির অনুরোধিত পরিসীমা পড়ুন।

ডিফল্টটি হ'ল buffer, যা সবচেয়ে বেশি প্রভাব ফেলে (উচ্চতর ব্যয়, সেরা প্রভাব)।

আরও বিশদের জন্য ম্যানুয়ালটি পড়ুন , উদ্ধৃতিগুলি সেখান থেকে।
Depesz এটি সম্পর্কেও ব্লগ করেছে।


4

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

আপনি যদি প্রারম্ভকালে ডাটাবেসের পৃষ্ঠার ক্যাশে প্রাইম খুঁজছেন (উদাহরণস্বরূপ রিবুট বা অন্যান্য রক্ষণাবেক্ষণের পরে ডিবি ক্যাশে হওয়া সমস্ত কিছু ভুলে যায়) তবে নিম্নলিখিত স্ক্রিপ্ট লিখুন:

SELECT * FROM <table>
SELECT <primary key fields> FROM <table> ORDER BY <primary key fields>
SELECT <indexed fields> FROM <table> ORDER BY <indexed fields>

(প্রতিটি সূচক, বা কোর্সের জন্য সর্বশেষ পদক্ষেপটি পুনরাবৃত্তি করা হয়েছে এবং সঠিক ধারায় অর্ডার বর্ধমান ক্ষেত্রগুলি রাখতে সাবধান হন)

উপরেরটি চালানোর পরে প্রতিটি ডেটা এবং সূচী পাতাটি পড়া উচিত ছিল এবং এটি র্যাম পৃষ্ঠার ক্যাশে থাকবে (আপাতত কমপক্ষে)। আমাদের অ্যাপ্লিকেশন ডেটাবেসগুলির জন্য আমাদের মতো স্ক্রিপ্ট রয়েছে যা পুনরায় বুট করার পরে চালানো হয় যাতে সিস্টেমে লগ ইন করা প্রথম ব্যবহারকারীরা পরে ধীর সাড়া না দেয়। আপনি যে কোনো ধরনের স্ক্রিপ্ট হাতে লেখা, পরিবর্তে ডিবি সংজ্ঞা টেবিল স্ক্যান (যেমন বন্ধ আরও ভাল হয় sys.objects/ sys.indexes/ sys.columnsএমএস স্কুয়েল মধ্যে), তাহলে আপনি বেছে বেছে ইনডেক্স যে সবচেয়ে বেশি যে স্ক্যান বদলে ব্যবহার করা হয় স্ক্যান করতে পারে সবকিছু যা আর নিতে হবে।


3
এটি কমপক্ষে PostgreSQL এ কাজ করবে না। পুরো বাফার ক্যাশেটি ব্যবহার থেকে বিরত রাখতে সিক্যুয়াল স্ক্যানগুলির জন্য ভাগ করা বাফারগুলি থেকে একটি ছোট (256 কেবি) রিং বাফার বরাদ্দ করা হয়। বিশদটির জন্য github.com/postgres/postgres/blob/master/src/backend/stores/… দেখুন । আপনি একটি বৃহত টেবিল থেকে একটি নির্বাচন করুন * এরপরে পিজি_বফারচে টেবিলের দিকে (পিজি_বুফারচে এক্সটেনশান থেকে) এটি যাচাই করতে পারেন।
hbn

@ এইচবিএন হ্যালো, তবে এই সেভ থ্রেডের এই সহযোগী লোকটি বলে যে এটি কাজ করে - dba.stackexchange.com/a/36165/55752
সাইথারগন

@ সাইকথারগন এটি ওএস ক্যাশে শেষ হতে পারে, এটি পোস্টগ্র্যাস এসকিউএল বাফার ক্যাশে পাবেন না। আপনি যদি বিশ্বাস না করেন তবে উপরে আমি যা প্রস্তাব করেছি তা চেষ্টা করে দেখুন।
এইচবিএন

SELECT * FROM schema.tableপোস্টগ্রাস 9.5-এ, আমি চেষ্টা করে দেখেছি এটি আমার 100GiB পোস্টগ্র্যাস এসকিউএল বাফার ক্যাশে পুরো 60GiB টেবিলটি লোড করেছে।
সুডো

1

আমার অনুরূপ সমস্যা ছিল:
সার্ভার পরিষেবা পুনরায় চালু করার পরে এবং সমস্ত নগদ ডেটা ফেলে দেওয়া হয়েছে, প্রথম বারের মতো অনেক ক্যোয়ারী সত্যই ধীর গতির কারণ হিসাবে অনুসন্ধানের নির্দিষ্ট জটিলতার কারণ, যতক্ষণ না সমস্ত প্রয়োজনীয় সূচক এবং ডেটা নগদ না করা হয়। তার অর্থ, উদাহরণস্বরূপ ব্যবহারকারীদের অবশ্যই প্রতিটি "আইটেম" (1-3 সেকেন্ড এক্সিকিউশন সময়) এবং 50 মিলিয়ন সারি থেকে সম্পর্কিত ডেটা একবারে আঘাত করতে হবে, যাতে ব্যবহারকারীরা আর কোনও অযাচিত বিলম্ব অনুভব করবেন না। ব্যবহারকারীদের বিরক্তিকর হ্যাংগুলি अनुभव করতে প্রথম 3 ঘন্টা সময় লাগে, যতক্ষণ না বেশিরভাগ ব্যবহৃত ডেটা নগদ করা হয় এবং প্রোগ্রামগুলি উত্পাদন কর্মক্ষমতা সহ শীর্ষস্থানটি নষ্ট করে চলেছে, তারপরেও শেষ হয়, প্রথমবার অ্যাক্সেস করা ডেটা হিট করার সময় 2 দিন কয়েক হঠাৎ সংক্ষিপ্ত বিলম্ব হয় ... , পরিসংখ্যান ডেটা ইত্যাদির জন্য

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


0

হুঁ, কপি কমান্ড সাহায্য করতে পারে। কেবল স্টপআউট করার জন্য কপি চালান এবং এটি থেকে পড়ুন। Pg_dump ব্যবহার করে এটি করা সম্ভব:

pg_dump -U <user> -t <table> <database> > /dev/null

অন্য উপায় হ'ল সমস্ত টেবিল ফাইল সন্ধান এবং চালানো cat <files> > /dev/null

টেবিল ফাইলের নাম কীভাবে পাবেন সে সম্পর্কে এখানে উদাহরণ দেওয়া হল:

# SELECT oid, datname FROM pg_database ;
  oid  |  datname  
-------+-----------                                                                                                                                          
<...>
 16384 | test
-- out of database is 16384
# SELECT oid, relname FROM pg_class WHERE relname like 'fn%';
  oid  | relname 
-------+---------
 24576 | fn
(1 row)
-- oid of our table is 24576

সুতরাং, টেবিলের ফাইলগুলি গুলি / পাথ / থেকে / পিএসএসকিএল / ডেটা / বেস / 16384/24576 *

আপনি স্থানান্তরিত সূচীগুলি এবং টোস্ট টেবিলগুলিও পড়তে চান, একইভাবে তাদের ওয়েড পান।

বিটিডাব্লু, আপনার এটি কেন দরকার? আমি বিশ্বাস করি পোস্টগ্রেকএল এবং ওএস হটেস্ট ডেটা ক্যাশে করতে এবং ভাল বজায় রাখতে যথেষ্ট স্মার্ট। ক্যাশে দক্ষতা।


0

আমি কিউসফট থেকে র‌্যামড্রাইভ ব্যবহার করি , যা উইন্ডোজের জন্য দ্রুততম র‌্যামডিস্ক হিসাবে বেঞ্চমার্কযুক্ত ছিল । আমি স্রেফ ব্যবহার করেছি

initdb -D e:\data

যেখানে e: the হ'ল রামডিস্কের স্থান।


5
উইন্ডোজে পিজি কোনও প্রোডাকশন সাইটের জন্য দুর্দান্ত সাহসী পছন্দ কারণ এটি উইন্ডোজ * নিক্সের চেয়ে কম (র‌্যাম থেকে পৃথক) ধীর।
ড্রকলোসোসোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.