উত্তর:
ব্যাখ্যা_এক্সপ্লেইন.পিডিএফ সাহায্য করতে পারে।
আমি যে অংশটি সবসময় বিভ্রান্তি পেয়েছিলাম তা হ'ল স্টার্টআপ ব্যয় বনাম মোট ব্যয়। আমি প্রতিবার এটি ভুলে গিয়েছি গুগল, যা আমাকে এখানে ফিরিয়ে এনেছে, যা পার্থক্য ব্যাখ্যা করে না, এই কারণেই আমি এই উত্তরটি লিখছি। এই আমি কি থেকে উত্পন্ন হয় Postgres EXPLAINডকুমেন্টেশন , ব্যাখ্যা হিসাবে আমি তা বুঝতে পারি।
ফোরাম পরিচালনা করে এমন একটি অ্যাপ্লিকেশন থেকে এখানে একটি উদাহরণ দেওয়া হয়েছে:
EXPLAIN SELECT * FROM post LIMIT 50;
Limit (cost=0.00..3.39 rows=50 width=422)
-> Seq Scan on post (cost=0.00..15629.12 rows=230412 width=422)
এখানে পিজএডমিনের গ্রাফিকাল ব্যাখ্যা:
(আপনি যখন পিজএডমিন ব্যবহার করছেন, ব্যয়ের বিবরণটি পড়তে আপনি কোনও উপাদানকে আপনার মাউসটি নির্দেশ করতে পারেন))
খরচ খরচ যেমন একটি tuple হিসাবে প্রতিনিধিত্ব করা হয়, LIMITহয় cost=0.00..3.39এবং ক্রমানুসারে স্ক্যানিং খরচ postহয় cost=0.00..15629.12। টুপলে প্রথম সংখ্যাটি হল স্টার্টআপ ব্যয় এবং দ্বিতীয় সংখ্যাটি মোট ব্যয় । যেহেতু আমি ব্যবহার করেছি EXPLAINএবং নেই EXPLAIN ANALYZE, এই খরচগুলি অনুমান, বাস্তব পদক্ষেপ নয়।
একটি জটিলতা হিসাবে, প্রতিটি "পিতামাতা" নোডের ব্যয়ের সাথে তার শিশু নোডের ব্যয়ও অন্তর্ভুক্ত থাকে। পাঠ্য উপস্থাপনায়, গাছটি ইন্ডেন্টেশন দ্বারা প্রতিনিধিত্ব করা হয়, উদাহরণস্বরূপ LIMITপিতামাতার নোড এবং Seq Scanএটির শিশু। পিজএডমিন উপস্থাপনায়, তীরগুলি শিশু থেকে পিতামাতার দিকে নির্দেশ করে - তথ্য প্রবাহের দিক - যা আপনি গ্রাফ তত্ত্বের সাথে পরিচিত হলে প্রতিরোধমূলক হতে পারে।
ডকুমেন্টেশন বলছেন যে খরচ সব সন্তানের নোড সমেত কিন্তু নোটিশ আছে পিতা বা মাতা মোট খরচ 3.39এটা সন্তানের মোট খরচ তুলনায় অনেক ছোট 15629.12। মোট ব্যয়টি অন্তর্ভুক্ত নয় কারণ এর মতো উপাদানটির LIMITপুরো ইনপুট প্রক্রিয়া করার প্রয়োজন হয় না। পোস্টগ্রিস ডকুমেন্টেশনেEXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2; উদাহরণটি দেখুন ।EXPLAIN
উপরের উদাহরণে, উভয় উপাদানগুলির জন্য প্রারম্ভকালীন সময় শূন্য, কারণ সারি লিখতে শুরু করার আগে কোনও উপাদানই কোনও প্রক্রিয়াজাতকরণের প্রয়োজন হয় না: ক্রমিক স্ক্যানটি টেবিলের প্রথম সারিটি পড়ে এবং এটিকে নির্গত করে। LIMITতার প্রথম সারিতে পড়ে এবং তারপর এটি নির্গত।
কোনও সারি আউটপুট শুরু করার আগে কোনও উপাদানকে যখন অনেকগুলি প্রক্রিয়াজাতকরণ করতে হবে? অনেকগুলি সম্ভাব্য কারণ রয়েছে তবে আসুন একটি স্পষ্ট উদাহরণ দেখি। এখানে আগের থেকে একই প্রশ্নটি রয়েছে তবে এখন একটি ORDER BYধারা রয়েছে:
EXPLAIN SELECT * FROM post ORDER BY body LIMIT 50;
Limit (cost=23283.24..23283.37 rows=50 width=422)
-> Sort (cost=23283.24..23859.27 rows=230412 width=422)
Sort Key: body
-> Seq Scan on post (cost=0.00..15629.12 rows=230412 width=422)
এবং গ্রাফিকালি:
আবার, সিক্যুয়াল স্ক্যানটির postকোনও প্রারম্ভিক ব্যয় নেই: এটি তত্ক্ষণাত্ সারি আউটপুট করা শুরু করে। তবে বাছাইটির একটি উল্লেখযোগ্য স্টার্টআপ ব্যয় হয় 23283.24কারণ এটি একটি একক সারিতেও আউটপুট দেওয়ার আগে পুরো টেবিলটি সাজতে হয় । বাছাইয়ের মোট ব্যয় 23859.27প্রারম্ভকালীন ব্যয়ের চেয়ে সামান্য বেশি, এটি প্রমাণ করে যে একবারে পুরো ডেটাসেট বাছাই হয়ে গেলে, বাছাই করা ডেটা খুব দ্রুত নির্গত হতে পারে।
লক্ষ্য করুন যে এর প্রারম্ভকালীন সময়টি LIMIT 23283.24সাজানোর প্রারম্ভকালীন সময়ের সাথে সমান। এটি এর কারণ নয় যে LIMITনিজের একটি খুব বেশি সময় শুরু করতে পারে। এটি আসলে শূন্য শুরুর সময় নিজেই থাকে তবে EXPLAINপ্রতিটি পিতামাতার জন্য সমস্ত বাচ্চার ব্যয়কে রোল করে দেয়, তাই LIMITসূচনার সময়টিতে তার বাচ্চার সমষ্টি শুরুর সময় অন্তর্ভুক্ত থাকে।
ব্যয়ের এই রোলআপটি প্রতিটি স্বতন্ত্র উপাদানটির কার্যকরকরণ ব্যয় বুঝতে অসুবিধা করতে পারে। উদাহরণস্বরূপ, আমাদের LIMITশুরুর সময় শূন্য, তবে এটি প্রথম নজরে সুস্পষ্ট নয়। এই কারণে, ব্যাখ্যা.ডেপেস.কম-এর সাথে যুক্ত আরও বেশ কয়েকটি ব্যক্তি , হুবার্ট লুবাচেসউস্কি (ওরফে ডিপেজ) দ্বারা তৈরি একটি সরঞ্জাম EXPLAINযা পিতামাতার ব্যয় থেকে বাচ্চার ব্যয়কে বিয়োগ করে - তিনি তার সরঞ্জাম সম্পর্কে একটি সংক্ষিপ্ত ব্লগ পোস্টে আরও কিছু জটিলতার কথা উল্লেখ করেছেন ।
এটি বেশিরভাগ ইনডেন্টড থেকে কমপক্ষে ইন্টেন্টেড কার্যকর করে এবং আমি পরিকল্পনার নীচ থেকে উপরে পর্যন্ত বিশ্বাস করি। (সুতরাং যদি দুটি ইন্ডেন্টেড বিভাগ থাকে, পৃষ্ঠার নীচে একটি প্রথমে কার্যকর করে এবং তারপরে যখন তারা অন্য নির্বাহীদের সাথে মিলিত হয়, তখন তাদের সাথে যোগ দেওয়ার নিয়ম কার্যকর হয় exec)
ধারণাটি হ'ল প্রতিটি পদক্ষেপে 1 বা 2 ডেটাসেট রয়েছে যা কিছু নিয়ম দ্বারা আগত হয় এবং প্রক্রিয়াজাত হয়। যদি কেবল একটি ডেটাসেট হয়, তবে সেই অপারেশনটি সেই ডেটা সেটে করা হয়। (উদাহরণস্বরূপ, আপনি কী সারিগুলি চান তা নির্ধারণের জন্য একটি সূচক স্ক্যান করুন, একটি ডেটাসেট ফিল্টার করুন বা এটি বাছাই করুন two) যদি দুটি হয় তবে দুটি ডেটাসেট হ'ল দুটি জিনিস যা আরও ইন্ডেন্ট করা হয় এবং আপনি যে নিয়ম দেখেন তাতে সেগুলি যোগ হয়। বেশিরভাগ নিয়মের অর্থ যুক্তিসঙ্গতভাবে সহজেই অনুমান করা যায় (বিশেষত যদি আপনি এর আগে পরিকল্পনাগুলির একগুচ্ছ ব্যাখ্যা পড়ে থাকেন) তবে আপনি ডকুমেন্টেশনটি দেখে বা (সহজ) কেবল বাক্যাংশটি নিক্ষেপ করে স্বতন্ত্র আইটেমগুলি যাচাই করার চেষ্টা করতে পারেন গুগল পাশাপাশি কয়েকটি কীওয়ার্ড EXPLAIN।
এটি অবশ্যই একটি সম্পূর্ণ ব্যাখ্যা নয়, তবে এটি যথেষ্ট প্রসঙ্গ সরবরাহ করে যা আপনি সাধারণত যা চান তা নির্ধারণ করতে পারেন। উদাহরণস্বরূপ প্রকৃত ডাটাবেস থেকে এই পরিকল্পনাটি বিবেচনা করুন:
explain analyze
select a.attributeid, a.attributevalue, b.productid
from orderitemattribute a, orderitem b
where a.orderid = b.orderid
and a.attributeid = 'display-album'
and b.productid = 'ModernBook';
------------------------------------------------------------------------------------------------------------------------------------------------------------
Merge Join (cost=125379.14..125775.12 rows=3311 width=29) (actual time=841.478..841.478 rows=0 loops=1)
Merge Cond: (a.orderid = b.orderid)
-> Sort (cost=109737.32..109881.89 rows=57828 width=23) (actual time=736.163..774.475 rows=16815 loops=1)
Sort Key: a.orderid
Sort Method: quicksort Memory: 1695kB
-> Bitmap Heap Scan on orderitemattribute a (cost=1286.88..105163.27 rows=57828 width=23) (actual time=41.536..612.731 rows=16815 loops=1)
Recheck Cond: ((attributeid)::text = 'display-album'::text)
-> Bitmap Index Scan on (cost=0.00..1272.43 rows=57828 width=0) (actual time=25.033..25.033 rows=16815 loops=1)
Index Cond: ((attributeid)::text = 'display-album'::text)
-> Sort (cost=15641.81..15678.73 rows=14769 width=14) (actual time=14.471..16.898 rows=1109 loops=1)
Sort Key: b.orderid
Sort Method: quicksort Memory: 76kB
-> Bitmap Heap Scan on orderitem b (cost=310.96..14619.03 rows=14769 width=14) (actual time=1.865..8.480 rows=1114 loops=1)
Recheck Cond: ((productid)::text = 'ModernBook'::text)
-> Bitmap Index Scan on id_orderitem_productid (cost=0.00..307.27 rows=14769 width=0) (actual time=1.431..1.431 rows=1114 loops=1)
Index Cond: ((productid)::text = 'ModernBook'::text)
Total runtime: 842.134 ms
(17 rows)
এটি নিজের জন্য পড়ার চেষ্টা করুন এবং দেখুন এটি অর্থবোধ করে কিনা।
আমি যা পড়ি তা হ'ল ডাটাবেসটি প্রথমে id_orderitem_productidসূচকটি স্ক্যান করে , এটির সাহায্যে সারিগুলি সন্ধান করতে এটি ব্যবহার করে orderitem, তারপরে একটি কুইকোর্ট ব্যবহার করে সেই ডেটাসেটটি সাজায় (ডাটাটি র্যামের সাথে মানানসই না হলে ব্যবহৃত ধরণের পরিবর্তন হবে), তারপরে সেটিকে আলাদা করে দেয়।
এরপরে, orditematt_attributeid_idxএটি যে সারিগুলি চায় সেগুলি অনুসন্ধান করার জন্য এটি স্ক্যান করে orderitemattributeএবং তারপরে একটি কুইকোর্ট ব্যবহার করে সেই ডেটাসেটটি সাজায়।
এটি তখন দুটি ডেটাসেট নেয় এবং সেগুলিকে একত্রিত করে। (একটি মার্জ জোড় এক ধরণের "জিপিং" অপারেশন যেখানে এটি দুটি সমান্তরালভাবে ডেটাসেটকে সমান্তরালভাবে হাঁটছে, যখন তারা মিলবে তখন যোগ করা সারিটি প্রেরণ করবে))
আমি যেমন বলেছি, আপনি পরিকল্পনার ভিতরের অংশটি বাইরের অংশের নীচে থেকে উপরে পর্যন্ত পরিকল্পনার মাধ্যমে কাজ করেন।
দেপেসেজ , একটি অনলাইন সহায়ক সরঞ্জাম উপলব্ধ , যা বিশ্লেষণের ফলাফলগুলির ব্যয়বহুল অংশগুলি কোথায় তা হাইলাইট করবে।
এছাড়াও একটি ফলাফল রয়েছে, এখানে একই ফলাফল রয়েছে , যা সমস্যাটি যেখানে রয়েছে তা আমার কাছে এটি আরও স্পষ্ট করে তোলে।
পিজিএডমিন আপনাকে ব্যাখ্যা পরিকল্পনার একটি গ্রাফিকাল উপস্থাপনা প্রদর্শন করবে। দুজনের মধ্যে পিছনে পিছনে স্যুইচ করা আপনাকে পাঠ্যের উপস্থাপনার অর্থ কী তা বুঝতে সাহায্য করতে পারে। তবে আপনি যদি এটি জানতে চান যে এটি কী করতে চলেছে তবে আপনি কেবল সর্বদা জিইউআই ব্যবহার করতে সক্ষম হতে পারেন।
PostgreSQL এর অফিসিয়াল ডকুমেন্টেশন ব্যাখ্যাটির আউটপুট কীভাবে বুঝতে হবে সে সম্পর্কে একটি আকর্ষণীয়, পুরো ব্যাখ্যা সরবরাহ করে।