আমার পোস্টগ্রিজ এসকিউএল কোয়েরিটি কতটা দূরে রয়েছে তা আমি কীভাবে খুঁজে বের করব?


35

আমার কতগুলি সারি নির্বাচন করুন তার সুনির্দিষ্ট শালীন ধারণা আছে ... আসলে ক্যোয়ারীটি প্রক্রিয়া করবে (উদাহরণস্বরূপ আমি জানি যে কতগুলি বাস্তবায়িত হবে)।

আমি বুঝতে পেরেছি পোস্টগ্র্রেস আমাকে শতকরা সম্পূর্ণতা বলবে না, এমন কোনও উপায় আছে (লগগুলিতে গভীরভাবে সমাহিত করা হয়েছে, সিস্টেম টেবিলগুলিতে বা অন্যথায়) যে আমি জানতে পারি যে কতগুলি সারি গন্তব্য সারণীতে পাম্প করা হয়েছে বা সেলেক্ট কোয়েরি দ্বারা পড়েছেন ?

উত্তর:


33

ড্যানিয়েল ভেরিট যেমন উল্লেখ করেছেন তেমন কোনও জেনেরিক সমাধান বলে মনে হচ্ছে না। কোনও ফাইল থেকে কোনও টেবিলে ডেটা লোড করার সময় লোডের অগ্রগতি পেতে নিম্নলিখিত কৌশলটি ব্যবহার করা যেতে পারে।

কপি কমান্ড কনসোল অগ্রগতি বার

একটি খালি টেবিল তৈরি করুন।

CREATE TABLE mytest (n int);

সারণীতে লোড করার জন্য 10 মিলিয়ন লাইন সহ একটি ডেটা ফাইল তৈরি করুন।

$ seq 10000000 > /tmp/data.txt

টেবিলের মধ্যে ফাইল থেকে ডেটা লোড করুন এবং একটি অগ্রগতি বারটি প্রদর্শন করুন।

$ pv /tmp/data.txt | psql -c "COPY mytest FROM STDIN;"

ডেমো

এখানে চিত্র বর্ণনা লিখুন

এটি কীভাবে কাজ করে

অনুলিপি কমান্ড STDIN বিকল্প ব্যবহার করে আমরা অন্য প্রক্রিয়া থেকে অনুলিপি অপারেশন জন্য ডেটা ফিড করতে পারেন। পিভি কমান্ড একটি ফাইল আউটপুট আনে এবং এটির অগ্রগতি বার, ইটিএ, মোট সময় অতিবাহিত এবং ডেটা স্থানান্তরের হার প্রদর্শন করে এর অগ্রগতি ট্র্যাক করবে।

কপি কমান্ড গ্রাফিকাল অগ্রগতি বার

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


2
আমি pvআগে কমান্ডটি দেখতে পেতাম না, এবং এটি আমার ডেবিয়ান সার্ভারে ডিফল্টরূপে ইনস্টল করা হয়নি, তবে এটি রেপোতে রয়েছে। বিবরণে বলা হয়েছে যে "পিভি (পাইপ ভিউয়ার) দুটি প্রক্রিয়াগুলির মধ্যে যে কোনও সাধারণ পাইপলাইনে beোকানো যেতে পারে যাতে ডেটা কীভাবে দ্রুত চলে যাচ্ছে" এর চাক্ষুষ ইঙ্গিত দেয়। একটি খুব দরকারী আদেশ!
রিচার্ড টার্নার

27

জেনেরিক, সমর্থিত পদ্ধতি বলে মনে হচ্ছে না, তবে কিছু কৌশল রয়েছে যা স্বতন্ত্র অনুসন্ধানের অগ্রগতির মূল্যায়ন করতে সীমিত প্রসঙ্গে ব্যবহার করা যেতে পারে। এখানে তাদের কিছু.

সিকোয়েন্স

যখন কোনও নির্বাচন বা আপডেট আপডেটের কোয়েরিতে কোনও অন্তর্ভুক্ত থাকে nextval(sequence_name)বা কোনও ইনসার্টের একটি গন্তব্য কলাম থাকে nextvalডিফল্ট হিসাবে, তখন সিক্যুয়েন্স মানটি অন্য সেশনে বারবার জিজ্ঞাসা করা যেতে পারে SELECT sequence_name.last_value। এটি কাজ করে কারণ ক্রমগুলি লেনদেনের দ্বারা আবদ্ধ নয়। যখন এক্সিকিউশন প্ল্যানটি এমন হয় যে ক্যোয়ারের সময় ক্রমটি রৈখিকভাবে বৃদ্ধি করা হয়, তখন এটি অগ্রগতি সূচক হিসাবে ব্যবহার করা যেতে পারে।

pgstattuple

Pgstattuple contrib মডিউল ফাংশন যে সরাসরি তথ্য পেজ এ উঁকি করতে পারেন। দেখা যাচ্ছে যে যখন টিপলগুলি একটি খালি টেবিলের মধ্যে inোকানো হয় এবং এখনও প্রতিশ্রুতিবদ্ধ হয় না, তখন তারা ফাংশন dead_tuple_countথেকে ক্ষেত্রের মধ্যে গণনা করা হয় pgstattuple

9.1 সহ ডেমো: একটি খালি টেবিল তৈরি করুন

CREATE TABLE tt AS (n numeric);

এর মধ্যে 10M সারি sertোকানো যাক:

INSERT INTO tt SELECT * FROM random() from generate_series(1,10000000);

অন্য সেশনে, সন্নিবেশের সময় প্রতি সেকেন্ডে pgstattuple পরীক্ষা করুন:

$ while true;
   do psql -Atc "select dead_tuple_count from pgstattuple('tt')";
   sleep 1;
  done

ফলাফল:

0
69005
520035
1013430
1492210
1990415
2224625
2772040
3314460
3928660
4317345
4743770
5379430
6080950
6522915
7190395
7953705
8747725
9242045
0

সন্নিবেশ শেষ হয়ে গেলে এটি 0 এ ফিরে আসে (সমস্ত টিপল দৃশ্যমান এবং লাইভ হয়)।

এই কৌশলটি ব্যবহার করা যেতে পারে যখন টেবিলটি নতুনভাবে তৈরি করা হয় না, তবে প্রাথমিকটির dead_tuple_countশূন্য-অমূল্যের মান হওয়ার সম্ভাবনা থাকে এবং এটি একই সাথে পরিবর্তিত হতে পারে যদি অটোভ্যাকুমের মতো অন্যান্য লেখার ক্রিয়াকলাপ চলছে (সম্ভবতঃ? কোন স্তরের স্তর সম্পর্কে নিশ্চিত নয়) স্বতঃব্যাকুয়ামের সাথে প্রত্যাশার সম্মতি)।

তবে সারণিটি বিবৃতি নিজেই ( CREATE TABLE ... AS SELECTবা SELECT * INTO newtable) তৈরি করে তৈরি করা হয়েছে, কারণ সৃষ্টিটি লেনদেন হয়েছে। কাজের দিকটি হ'ল কোনও সারি ছাড়াই টেবিল তৈরি করা (যুক্ত LIMIT 0) এবং পরবর্তী লেনদেনে এটি পপুলেট করা।

দ্রষ্টব্য যেটি pgstattupleনিখরচায় আসে না: এটি প্রতিটি কলে পুরো টেবিলটি স্ক্যান করে। এছাড়াও এটি সুপারউসারদের মধ্যে সীমাবদ্ধ।

কাস্টম কাউন্টার

পাভেল স্টিহুলের ব্লগে তিনি সিতে প্রয়োগ করা একটি পাল্টা ফাংশন সরবরাহ করেন যা নির্দিষ্ট সংখ্যক মৃত্যুদন্ড কার্যকর করার বিজ্ঞপ্তি দেয়। এক্সিকিউটারকে এটি কল করতে আপনাকে কোনওভাবে ক্যোয়ারির সাথে ফাংশনটি একত্রিত করতে হবে। প্রশ্নগুলির সময় নোটিশগুলি প্রেরণ করা হয় এবং তাদের পৃথক সেশনের প্রয়োজন নেই, কেবলমাত্র একটি এসকিউএল ক্লায়েন্ট যা তাদের প্রদর্শন করে ( psqlস্পষ্ট প্রার্থী হয়ে)।

নোটিশ বাড়াতে INSERT INTO এর উদাহরণ:

/* transformation */
INSERT INTO destination_table
   SELECT (r).*
  FROM (SELECT counter(to_destination_table(_source), 1000, true) r
           FROM source _source) x

ফাংশনগুলির জন্য স্ট্যাকওভারফ্লো সম্পর্কিত সম্পর্কিত প্রশ্ন:
দীর্ঘকাল ধরে চলমান PostgreSQL ফাংশন থেকে ক্লায়েন্টে কীভাবে অগ্রগতি প্রতিবেদন করবেন

ভবিষ্যতের বিকল্পগুলি?

মে 2017 পর্যন্ত, বিকাশকারীদের সম্প্রদায়ের কাছে একটি প্রতিশ্রুতিবদ্ধ প্যাচ জমা দেওয়া হয়েছে: [প্যাচ ভি 2] দীর্ঘকাল ধরে চলমান এসকিউএল অনুসন্ধানগুলির অগ্রগতি পর্যবেক্ষণ করার জন্য অগ্রগতি কমান্ড

যা PostgreSQL 11 বা তার পরে জেনেরিক সমাধান হিসাবে শেষ হতে পারে। ব্যবহারকারীরা যারা ওয়ার্ক-ইন-প্রগ্রেস বৈশিষ্ট্যে অংশ নিয়েছে বলে মনে করছেন তারা প্যাচের সর্বশেষতম সংস্করণ প্রয়োগ করতে পারেন এবং প্রস্তাবিত PROGRESSআদেশটি ব্যবহার করতে পারেন।


3

@ আমিরআলিআকবাড়ি যেমন তার উত্তরে উল্লিখিত হয়েছে ততক্ষণ অগ্রগতির প্রতিবেদন কার্যকারিতা বাড়ানো হবে না, এখানে একটি ওএস-স্তরের কর্মসংস্থান রয়েছে।

এটি কেবল লিনাক্সে কাজ করে তবে সম্ভবত কোনও অপারেটিং সিস্টেমের জন্য সহজেই গুগলযোগ্য অনুরূপ সমাধান পাওয়া যায়।

বৃহত্তম সুবিধা এবং পোস্টগ্রি অসুবিধা, যে তার ব্যাক-এন্ডের সব সহজ একক থ্রেডেড প্রসেস ব্যবহার করছেন lseek(), read()এবং write()তাদের টেবিল ফাইল নিপূণভাবে, অথচ তারা ভাগ Mem এবং কেশ উপর আলাপচারিতার করছে।

এই ফলাফলগুলি, এর সমস্ত ব্যাকএন্ড প্রক্রিয়া সর্বদা একক কোয়েরিতে কাজ করে যা সহজেই পাওয়া যায় এবং সহজেই straced।

প্রথমত, আপনি একটি থেকে ব্যাকএন্ড পিআইডি দেখতে পারেন SELECT * FROM pg_stat_activity;:

29805270 | dbname  | 20019 |    16384 | username  |                  |             |                 |          -1 | 2018-09-19 21:31:57.68234+02  | 2018-09-19 21:31:59.435376+02 | 2018-09-\
20 00:34:30.892382+02 | 2018-09-20 00:34:30.892386+02 | Client          | ClientRead | active              |       92778 |        92778 |  INSERT INTO ...something...

তৃতীয় কলামটি হ'ল পিড। PostgreSQL এ, এটি ব্যাকএন্ডের লিনাক্স প্রক্রিয়া পিডের সমান।

এর পরে, আপনি এটি strace পারেন, একটি উদাহরণস্বরুপ strace -p 20019 -s 8192: ( -s 8192কারণ PostgreSQL 8192 বাইট দীর্ঘ ব্লক সঙ্গে কাজ করে দরকারী)।

sendto(10, "C\0\0\0\17INSERT 0 1\0Z\0\0\0\5T", 22, 0, NULL, 0) = 22
recvfrom(10, "Q\0\0\1\267 INSERT <removed by @peterh>", 8192, 0, NULL, NULL) = 440
sendto(10, "C\0\0\0\17INSERT 0 1\0Z\0\0\0\5T", 22, 0, NULL, 0) = 22
lseek(298, 343634345)...
read(298, "<block data which was read in>"....
write(298, "<block data which was written out>"...

এর অর্থ:

  • sendtoযদি ব্যাকএন্ড কোনও ক্লায়েন্টকে কিছু উত্তর দেয় happens উদাহরণস্বরূপ, এটি একটি INSERTক্যোয়ারির ফলাফলের উত্তর দেয় ।
  • recvfromব্যাকএন্ড কোনও ক্লায়েন্টের কাছ থেকে কিছু পেলে ঘটে। এটি সাধারণত একটি নতুন ক্যোয়ারী, উদাহরণস্বরূপ, অন্য একটি INSERT
  • lseek যদি কোনও টেবিল ফাইলে ব্যাকএন্ড অবস্থান পরিবর্তন করে।
  • read যদি ব্যাকএন্ডটি কোনও টেবিল ফাইল থেকে একটি ব্লক পড়ে থাকে happens
  • write যদি ব্যাকএন্ড কোনও টেবিল ফাইলে একটি ব্লক লিখে দেয় happens

ক্ষেত্রে readএবং write, এছাড়াও আপনি সারণিতে যে ব্লক সামগ্রী দেখতে পারবে। এটি বুঝতে সাহায্য করে যে এটি কী করছে এবং এটি কোথায় রয়েছে is

এর ক্ষেত্রে recvfrom, আপনি ব্যাকএন্ড কী পেয়েছে তা প্রকৃত ক্যোয়ারীটি দেখতে পারেন।


2

অন্যান্য উত্তরে যেমন বলা হয়েছে, বর্তমানে সাধারণভাবে অগ্রগতি প্রতিবেদনের সরাসরি কোনও উপায় নেই।

পোস্টগ্র্রেএসকিউএলে কমান্ড প্রয়োগের সময় নির্দিষ্ট কমান্ডের অগ্রগতি রিপোর্ট করার ক্ষমতা রয়েছে। বর্তমানে, একমাত্র কমান্ড যা অগ্রগতি প্রতিবেদন সমর্থন করে তা হ'ল ভ্যাকুয়াম। ভবিষ্যতে এটি প্রসারিত হতে পারে।

যাইহোক, 9.6 থেকে শুরু করে, যখনই VACUUMচলমান থাকে, pg_stat_progress_vacuumভিউতে প্রতিটি ব্যাকএন্ডের জন্য (অটোভাকুম কর্মী প্রসেস সহ) এক সারি থাকবে যা বর্তমানে শূন্য। সম্পর্কে আরও বিশদ pg_stat_progress_vacuumডকুমেন্টেশনে পাওয়া যাবে: 27.4 অগ্রগতি প্রতিবেদন করা

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