পোস্টগ্র্রেএসকিউএল আমাকে ঠিক কী বলার ব্যাখ্যা দেয়?


116

মাইএসকিউএল এর ব্যাখ্যা আউটপুট বেশ সোজা। PostgreSQL এর কিছুটা জটিল। আমি কোনও ভাল উত্স খুঁজে পেতে সক্ষম হইনি যা এটির ব্যাখ্যাও করে।

আপনি ঠিক কী ব্যাখ্যা করছেন তা বর্ণনা করতে পারবেন বা কমপক্ষে আমাকে একটি ভাল উত্সের দিকে নির্দেশ করুন?

উত্তর:


50

ব্যাখ্যা_এক্সপ্লেইন.পিডিএফ সাহায্য করতে পারে।


64
লোকেরা স্লাইড ডেকগুলি ভাল প্রযুক্তিগত ডকুমেন্টেশন কেন মনে করে তা আমি সন্তুষ্ট। আলাপের একটি ভিডিও হয়ত সহায়ক হতে পারে তবে সেই স্লাইড ডেকের তথ্য ঘনত্ব শূন্যের খুব কাছাকাছি। প্রথম ছয়টি স্লাইডগুলিতে (মোটের 1/5 তম) প্রযুক্তিগত সামগ্রীর ঠিক 1 বাক্য রয়েছে: "• কোনও ডিএমএলকে কেবল নির্বাচন (যেমন আপডেট, ডিলিট এবং INSERT) হিসাবে কাজ করে ব্যাখ্যা করুন"। আমার সবচেয়ে বড় ভুল বোঝাবুঝি "স্টার্টআপ" সময় মানে, এবং এই 30 ডলার স্লাইডে কোথাও ব্যাখ্যা করা হয়নি।
মার্ক ই। হাজেস

80

আমি যে অংশটি সবসময় বিভ্রান্তি পেয়েছিলাম তা হ'ল স্টার্টআপ ব্যয় বনাম মোট ব্যয়। আমি প্রতিবার এটি ভুলে গিয়েছি গুগল, যা আমাকে এখানে ফিরিয়ে এনেছে, যা পার্থক্য ব্যাখ্যা করে না, এই কারণেই আমি এই উত্তরটি লিখছি। এই আমি কি থেকে উত্পন্ন হয় 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যা পিতামাতার ব্যয় থেকে বাচ্চার ব্যয়কে বিয়োগ করে - তিনি তার সরঞ্জাম সম্পর্কে একটি সংক্ষিপ্ত ব্লগ পোস্টে আরও কিছু জটিলতার কথা উল্লেখ করেছেন ।


4
এই জন্য আপনাকে ধন্যবাদ. আমি একটি ব্যাখ্যা ভিজুয়ালাইজার যুক্ত করতে চাই যা আউটপুট (ইমো) প্রদর্শনের আরও ভাল কাজ করে। tatiyants.com/pev
জোনাথন পোর্টার

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

43

এটি বেশিরভাগ ইনডেন্টড থেকে কমপক্ষে ইন্টেন্টেড কার্যকর করে এবং আমি পরিকল্পনার নীচ থেকে উপরে পর্যন্ত বিশ্বাস করি। (সুতরাং যদি দুটি ইন্ডেন্টেড বিভাগ থাকে, পৃষ্ঠার নীচে একটি প্রথমে কার্যকর করে এবং তারপরে যখন তারা অন্য নির্বাহীদের সাথে মিলিত হয়, তখন তাদের সাথে যোগ দেওয়ার নিয়ম কার্যকর হয় 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এবং তারপরে একটি কুইকোর্ট ব্যবহার করে সেই ডেটাসেটটি সাজায়।

এটি তখন দুটি ডেটাসেট নেয় এবং সেগুলিকে একত্রিত করে। (একটি মার্জ জোড় এক ধরণের "জিপিং" অপারেশন যেখানে এটি দুটি সমান্তরালভাবে ডেটাসেটকে সমান্তরালভাবে হাঁটছে, যখন তারা মিলবে তখন যোগ করা সারিটি প্রেরণ করবে))

আমি যেমন বলেছি, আপনি পরিকল্পনার ভিতরের অংশটি বাইরের অংশের নীচে থেকে উপরে পর্যন্ত পরিকল্পনার মাধ্যমে কাজ করেন।


22

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

এছাড়াও একটি ফলাফল রয়েছে, এখানে একই ফলাফল রয়েছে , যা সমস্যাটি যেখানে রয়েছে তা আমার কাছে এটি আরও স্পষ্ট করে তোলে।


20
ব্যাখ্যা-analyze.info নিচে বলে মনে হচ্ছে, তবে আমি একমত যে ব্যাখ্যা.ডেপস.কম খুব সহায়ক।
benvolioT

13

পিজিএডমিন আপনাকে ব্যাখ্যা পরিকল্পনার একটি গ্রাফিকাল উপস্থাপনা প্রদর্শন করবে। দুজনের মধ্যে পিছনে পিছনে স্যুইচ করা আপনাকে পাঠ্যের উপস্থাপনার অর্থ কী তা বুঝতে সাহায্য করতে পারে। তবে আপনি যদি এটি জানতে চান যে এটি কী করতে চলেছে তবে আপনি কেবল সর্বদা জিইউআই ব্যবহার করতে সক্ষম হতে পারেন।



0

আপনি যদি প্যাগাডমিন ইনস্টল করেন তবে একটি ব্যাখ্যা বোতাম রয়েছে যা পাঠ্য আউটপুট দেওয়ার সাথে সাথে যা ঘটছে তার চিত্রগুলি আঁকবে, ফিল্টারগুলি, ধরণের এবং উপ-সেট মার্জগুলি দেখায় যা ঘটছে তা দেখার জন্য আমি সত্যিই দরকারী বলে মনে করি।

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