পোস্টগ্র্রেসকে কীভাবে একটি নির্দিষ্ট সূচক ব্যবহার করতে বাধ্য করব?


112

পোস্টগ্র্রেসকে যখন অন্যথায় অনুক্রমিক স্ক্যান করার জন্য জোর দেওয়া হয় তখন আমি কীভাবে একটি সূচক ব্যবহার করতে বাধ্য করব?



1
+1 আমি এই বৈশিষ্ট্যটি দেখতে পছন্দ করব। এটি কেবল সিক স্ক্যান অক্ষম করার বিষয় নয়, যেমন অন্যান্য উত্তরগুলি বলে: আমাদের পিজিকে একটি নির্দিষ্ট সূচক ব্যবহার করতে বাধ্য করার ক্ষমতা প্রয়োজন । এটি হ'ল আসল শব্দের পরিসংখ্যানগুলি সম্পূর্ণ ভুল হতে পারে এবং সেই সময়ে আপনাকে অবিশ্বস্ত / আংশিক ওয়ার্কআউন্ডস ব্যবহার করতে হবে। আমি একমত যে সাধারণ ক্ষেত্রে আপনার প্রথমে সূচিপত্র এবং অন্যান্য সেটিংস পরীক্ষা করা উচিত তবে বড় ডেটাতে নির্ভরযোগ্যতা এবং উন্নত ব্যবহারের জন্য আমাদের এটির প্রয়োজন।
কলিমার্কো

মাইএসকিউএল এবং ওরাকল উভয়েরই এটি আছে ... পোস্টগ্রেসের পরিকল্পনাকারী কেন এত বিশ্বাসযোগ্য নয় তা নিশ্চিত নয়।
কেভিন পার্কার

উত্তর:


103

ধরে নেওয়া যায় যে আপনি অনেক ডাটাবেসে পাওয়া সাধারণ "ইনডেক্স ইঙ্গিত" বৈশিষ্ট্যটি সম্পর্কে জিজ্ঞাসা করছেন, পোস্টগ্র্যাসকিউএল এমন বৈশিষ্ট্য সরবরাহ করে না। পোস্টগ্র্রেএসকিউএল টিম এই সচেতন সিদ্ধান্ত নিয়েছিল। পরিবর্তে কেন এবং আপনি কী করতে পারেন তার একটি ভাল ওভারভিউ এখানে পাওয়া যাবে । মূলত কারণগুলি হ'ল এটি একটি পারফরম্যান্স হ্যাক যা পরে আপনার ডেটা পরিবর্তনের সাথে সাথে আরও বেশি সমস্যা দেখা দেয়, অন্যদিকে পোস্টগ্র্যাসএসকিউএল এর অপ্টিমাইজার পরিসংখ্যানের ভিত্তিতে পরিকল্পনার পুনরায় মূল্যায়ন করতে পারে। অন্য কথায়, বর্তমানে একটি ভাল ক্যোয়ারী প্ল্যান কী হতে পারে সম্ভবত সর্বকালের জন্য একটি ভাল ক্যোয়ারী পরিকল্পনা হবে না এবং সূচি ইঙ্গিতগুলি সর্বকালের জন্য একটি নির্দিষ্ট ক্যোয়ারী পরিকল্পনা জোর করে।

খুব কট্টর হাতুড়ি হিসাবে, পরীক্ষার জন্য দরকারী, আপনি enable_seqscanএবং enable_indexscanপরামিতি ব্যবহার করতে পারেন । দেখা:

এগুলি চলমান উত্পাদন ব্যবহারের জন্য উপযুক্ত নয় । আপনার যদি ক্যোয়ারী পরিকল্পনা পছন্দ নিয়ে সমস্যা থাকে তবে আপনার ক্যোয়ারি পারফরম্যান্স সংক্রান্ত সমস্যাগুলি ট্র্যাক করার জন্য ডকুমেন্টেশনটি দেখতে হবে । শুধু enable_প্যারাম সেট করে চলে না।

সূচকটি ব্যবহারের জন্য যদি আপনার কাছে খুব ভাল কারণ না থাকে তবে পোস্টগ্র্রেস সঠিক পছন্দ করতে পারে। কেন?

  • ছোট টেবিলগুলির জন্য, ক্রমিক স্ক্যান করা আরও দ্রুত।
  • ডেটাটাইপগুলি সঠিকভাবে মেলে না, তখন পোস্টগ্রিস সূচকগুলি ব্যবহার করে না, আপনাকে উপযুক্ত ক্যাসট অন্তর্ভুক্ত করতে হতে পারে।
  • আপনার পরিকল্পনাকারী সেটিংস সমস্যার কারণ হতে পারে।

এই পুরানো নিউজগ্রুপ পোস্টটিও দেখুন ।


4
সম্মতি জানানো হয়েছে, পোস্টগ্রাগেসকে এটিকে আপনার পথে করা বাধ্য করা এর অর্থ সাধারণত আপনি এটি ভুল করেছেন। 9/10 টাইমস পরিকল্পনাকারী আপনি যে কোনও কিছু সামনে আসতে পারেন beat অন্য 1 বার এর কারণ আপনি এটি ভুল করেছেন।
কেন্ট ফ্রেড্রিক

আমি মনে করি এটি আপনার সূচক হোল্ডের প্রকৃত অপারেটর ক্লাসগুলি পরীক্ষা করার জন্য এটি একটি ভাল ধারণা।
metdos

2
আমি একটি পুরানো প্রশ্ন পুনরুদ্ধার করতে ঘৃণা করি তবে আমি প্রায়শই পোস্টগ্রাস ডকুমেন্টেশন, আলোচনা এবং এখানে দেখতে পাই তবে একটি ছোট টেবিলের জন্য কি যোগ্যতার জন্য একটি সাধারণ ধারণা আছে ? এটি কি 5000 সারি বা 50000 ইত্যাদির মতো?
ওয়াফল

1
@ ওয়াফল আপনি কি বেঞ্চমার্কিং বিবেচনা করেছেন? একটি সূচকের সাথে একটি সাধারণ টেবিল তৈরি করুন এবং এলোমেলো জাঙ্কের এন সারিতে পূর্ণ করার জন্য একটি সহ কার্যকারিতা । তারপরে এন এর বিভিন্ন মানের জন্য ক্যোয়ারী পরিকল্পনাটি সন্ধান শুরু করুন । আপনি যখন এটি সূচকটি ব্যবহার শুরু করতে দেখেন, আপনার একটি বলপার্ক উত্তর থাকা উচিত। আপনি যদি পোস্টগ্রেএসকিউএল নির্ধারণ করে (পরিসংখ্যানের ভিত্তিতে) যে কোনও সূচক স্ক্যান খুব বেশি সারিও সরিয়ে ফেলছে না তবে আপনি ক্রমিক স্ক্যানগুলিও পেতে পারেন। সুতরাং যখন আপনার বাস্তব পারফরম্যান্সের উদ্বেগ থাকে তখন বেঞ্চমার্কিং সর্বদা একটি ভাল ধারণা। অবিস্মরণীয় অনুমান হিসাবে, আমি বলতে পারি কয়েক হাজার সাধারণত "ছোট" হয়।
jpmc26

11
ওরাকল, টেরাদাতা এবং এমএসএসকিউএল হিসাবে প্ল্যাটফর্মে 30 বছরেরও বেশি অভিজ্ঞতার সাথে আমি পোস্টগ্র্রেএসকিউএল 10 এর অপ্টিমাইজারটি বিশেষত স্মার্ট না। এমনকি আপ-টু-ডেট পরিসংখ্যান থাকা সত্ত্বেও এটি একটি বিশেষ দিকে বাধ্য করার চেয়ে কম দক্ষ সম্পাদনের পরিকল্পনা উত্পন্ন করে। এই সমস্যাগুলিকে ক্ষতিপূরণ দেওয়ার জন্য কাঠামোগত ইঙ্গিত প্রদান করা পোস্টগ্র্রেএসকিউএলকে আরও বেশি বাজার বিভাগে বাড়তে দেয় এমন একটি সমাধান সরবরাহ করবে। এই প্রোগ্রামটিতে।
গাইডো endণদানকারী

75

সম্ভবত ব্যবহারের একমাত্র বৈধ কারণ

set enable_seqscan=false

আপনি যখন ক্যোয়ারী লিখছেন এবং তাড়াতাড়ি দেখতে চান যে টেবিলগুলিতে প্রচুর পরিমাণে ডেটা থাকত তবে কোয়েরি প্ল্যানটি আসলে কী হবে। অথবা অবশ্যই যদি আপনার দ্রুত জিজ্ঞাসার প্রয়োজন হয় যে আপনার ক্যোয়ারী সূচকটি ব্যবহার করছে না কেবল ডাটাবেসটি খুব ছোট।


41
এই সংক্ষিপ্ত উত্তর আসলে পরীক্ষার উদ্দেশ্যে একটি ভাল ইঙ্গিতটি দেয়
dwery

3
কেউই প্রশ্নের উত্তর দিচ্ছে না!
ইভাইলো বারদারোভ

@ ইভায়েলো বারদারভ এই সমস্ত পরামর্শ এখানে দেওয়ার কারণ পোস্টগ্র্রেএসকিউএল এর বৈশিষ্ট্য নেই; এটি সাধারণত এটি কীভাবে ব্যবহৃত হয় এবং দীর্ঘমেয়াদী সমস্যার কারণ হয় তার ভিত্তিতে এটি বিকাশকারীরা একটি সচেতন সিদ্ধান্ত নিয়েছিলেন।
jpmc26

পরীক্ষার জন্য একটি দুর্দান্ত কৌশল: চালান set enable_seqscan=false, আপনার ক্যোয়ারী চালান, এবং তারপরে set enable_seqscan=trueসঠিকভাবে পোস্টগ্র্যাস্কেল ফিরে পেতে দ্রুত চালান (এবং স্পষ্টতই প্রযোজনায় এটি কেবলমাত্র উন্নয়নে করবেন না!)
ব্রায়ান হেলকিন

2
@ ব্রায়ান হেলিকিন বেটার, SET SESSION enable_seqscan=falseকেবল নিজের উপর প্রভাব ফেলতে
ইজকাটা

20

কখনও কখনও PostgreSQL নির্দিষ্ট অবস্থার জন্য সূচকের সেরা পছন্দ করতে ব্যর্থ হয়। উদাহরণ হিসাবে ধরা যাক, কয়েক মিলিয়ন সারি সহ একটি লেনদেনের টেবিল রয়েছে যার মধ্যে কোনও নির্দিষ্ট দিনের জন্য কয়েকশ রয়েছে এবং সারণীতে চারটি সূচক রয়েছে: লেনদেন_আইডি, ক্লায়েন্ট_আইডি, তারিখ এবং বিবরণ। আপনি নিম্নলিখিত কোয়েরি চালাতে চান:

SELECT client_id, SUM(amount)
FROM transactions
WHERE date >= 'yesterday'::timestamp AND date < 'today'::timestamp AND
      description = 'Refund'
GROUP BY client_id

পোস্টগ্রেএসকিউএল লেনদেন_ডেট_আইডিএক্স এর পরিবর্তে সূচি লেনদেনের_ডেস্কিপশন_আইডিএক্স ব্যবহার করতে বেছে নিতে পারে, যা এক সেকেন্ডের চেয়ে কম কয়েক মিনিটের পরিবর্তে ক্যোয়ারিতে কয়েক মিনিট সময় নিতে পারে। যদি এটি হয় তবে আপনি শর্তটিকে এই জাতীয়ভাবে ফিরিয়ে দিয়ে তারিখটিতে সূচকটি ব্যবহার করতে বাধ্য করতে পারেন:

SELECT client_id, SUM(amount)
FROM transactions
WHERE date >= 'yesterday'::timestamp AND date < 'today'::timestamp AND
      description||'' = 'Refund'
GROUP BY client_id

3
চমৎকার ধারণা. যাইহোক, আমরা যখন এই পদ্ধতির সাহায্যে বর্তমান সূচক ব্যবহারটি অক্ষম করি - পরবর্তী উপযুক্ত সূচকগুলিতে পোস্টগ্রেস্কল ক্যোয়ারী অপ্টিমাইজার ফলব্যাক ks সুতরাং, অপ্টিমাইজারটি বেছে নেওয়ার কোনও গ্যারান্টি নেই your_wanted_index, এটি এমন হতে পারে যে পোস্টগ্রেস্কেল ইঞ্জিন পরিবর্তে কেবল একটি সিকোয়েন্স / প্রাথমিক কী স্ক্যান করবে। উপসংহার - পোস্টগ্রেএসকিএল সার্ভারের জন্য কিছু সূচক ব্যবহারকে বাধ্য করার জন্য 100% নির্ভরযোগ্য পদ্ধতি নেই।
অগ্নিওস ভ্যাসিলিয়াসকাস

যদি whereশর্ত না থাকে তবে দুটি টেবিল বা যোগদান এবং পোস্টগ্রিস সূচকটি নিতে ব্যর্থ।
লুনা লাভগুড

@ সূর্য উপরোক্ত যেখানে এবং যোগদানের জন্য উভয় ক্ষেত্রেই প্রযোজ্য ... শর্ত অনুসারে
জিগি ক্রুয়েল্টিফ্রি জিটজিস্টার

18

সংক্ষিপ্ত উত্তর

এই সমস্যাটি সাধারণত তখন ঘটে যখন সূচকের স্ক্যানের আনুমানিক ব্যয় খুব বেশি এবং সঠিকভাবে বাস্তবতার প্রতিফলন ঘটায় না। এটি random_page_costঠিক করতে আপনার কনফিগারেশন প্যারামিটারটি কম করতে হতে পারে । থেকে Postgres ডকুমেন্টেশন :

এই মান হ্রাস [...] সিস্টেম সূচক স্ক্যান পছন্দ করতে পারে; এটি বাড়াতে সূচি স্ক্যানগুলি তুলনামূলকভাবে আরও ব্যয়বহুল দেখায়।

কোনও নিম্নমান প্রকৃতপক্ষে পোস্টগ্রাসকে সূচকটি ব্যবহার করবে কিনা তা আপনি পরীক্ষা করতে পারেন (তবে এটি কেবল পরীক্ষার জন্য ব্যবহার করুন ):

EXPLAIN <query>;              # Uses sequential scan
SET random_page_cost = 1;
EXPLAIN <query>;              # May use index scan now

আপনি SET random_page_cost = DEFAULT;আবার ডিফল্ট মান পুনরুদ্ধার করতে পারেন ।

পটভূমি

সূচি স্ক্যানগুলির জন্য অ-অনুক্রমিক ডিস্ক পৃষ্ঠা আনতে হবে। পোস্টগ্রিস random_page_costঅনুক্রমিক আনুষঙ্গিক আনুষাঙ্গিক আনুষঙ্গিক আনার ক্ষেত্রে ব্যয় অনুমান করতে ব্যবহার করে। ডিফল্ট মান হ'ল ক্রমবর্ধমান ফেচগুলি (অ্যাকাউন্টে ক্যাচিং এফেক্ট গ্রহণ করে) এর তুলনায় 4 গড় ব্যয়কারী ফ্যাক্টর 4.0ধরে নেওয়া।

তবে সমস্যাটি হ'ল নিম্নলিখিত ডিফল্ট মানটি নিম্নলিখিত গুরুত্বপূর্ণ বাস্তব জীবনের পরিস্থিতিতে অনুপযুক্ত:

1) সলিড-স্টেট ড্রাইভগুলি

নথি যেমন স্বীকার করে:

ক্রমগুলির তুলনায় স্বল্প র‌্যান্ডম পড়ার ব্যয়যুক্ত স্টোরেজ, উদাহরণস্বরূপ সলিড-স্টেট ড্রাইভগুলি এর জন্য কম মান সহ আরও ভাল মডেলিং করা যেতে পারে random_page_cost

এই পোস্টের শেষ পয়েন্ট অনুসারে পোস্টগ্রিসকনফ 2018 এ বক্তৃতা থেকে সলিড-স্টেট ড্রাইভের random_page_costমধ্যে 1.0এবং কিছুতে সেট করা উচিত 2.0

2) ক্যাশেড ডেটা

যদি প্রয়োজনীয় সূচক ডেটা ইতিমধ্যে র‍্যামে ক্যাশে থাকে তবে একটি সূচি স্ক্যান সবসময় ক্রমিক স্ক্যানের চেয়ে তাত্পর্যপূর্ণ হবে। নথি বলছে:

অনুসারে, যদি আপনার ডেটা সম্পূর্ণরূপে ক্যাশে থাকে তবে [...] হ্রাস random_page_costযথাযথ হতে পারে।

সমস্যাটি হ'ল আপনি অবশ্যই প্রাসঙ্গিক ডেটা ইতিমধ্যে ক্যাশেড কিনা তা সহজেই জানতে পারবেন না। তবে, যদি নির্দিষ্ট সূচকটি প্রায়শই জিজ্ঞাসিত হয় এবং যদি সিস্টেমের পর্যাপ্ত র‍্যাম থাকে, তবে ডেটা ক্যাশে হওয়ার সম্ভাবনা রয়েছে এবং এটি random_page_costএকটি কম মানতে সেট করা উচিত। আপনাকে বিভিন্ন মান সহ পরীক্ষা করতে হবে এবং আপনার জন্য কী কাজ করে তা দেখতে হবে।

আপনি সুস্পষ্ট ডেটা ক্যাশিংয়ের জন্য pg_prewarm এক্সটেনশনটিও ব্যবহার করতে চাইতে পারেন ।



2
এমনকি উবুন্টুতে Pg 10.1-তে বড় (~ 600M সারি টেবিল) ইনডেক্স স্ক্যানের কাজ করতে আমাকে র্যান্ডম_পেজ_কোস্ট = 0.1 সেট করতে হয়েছিল। টুইটটি ছাড়াই, সিক স্ক্যান (সমান্তরাল হওয়া সত্ত্বেও) 12 মিনিট সময় নিচ্ছিল (নোট করুন যে বিশ্লেষণ সারণীটি সম্পাদন করা হয়েছিল!)) ড্রাইভটি এসএসডি। টুইটের পরে, নির্বাহের সময়টি 1 সেকেন্ডে পরিণত হয়েছিল।
আনাতোলি আলেকসিভ

আপনি আমার দিন বাঁচিয়েছেন। আমি উভয় প্রান্তে বিশ্লেষণ চালানোর পরেও একই ডাটাবেসে ঠিক একই প্রশ্নটি কীভাবে একটি মেশিনে 30 সেকেন্ড এবং অন্যটিতে 1 এরও কম সময় নিচ্ছে তা জানার চেষ্টা করতে গিয়ে পাগল হয়ে যাচ্ছিলাম ... যার জন্য এটি উদ্বিগ্ন হতে পারে: আদেশটি ' ALTER SYSTEM SET এলোমেলো_পৃষ্ঠা_কোস্ট = x 'বিশ্বব্যাপী নতুন ডিফল্ট মান সেট করে।
জুলিয়ান

10

নিজেই প্রশ্নটি খুব অবৈধ। জোর করে দেওয়া (উদাহরণস্বরূপ সক্ষম_সেকস্কান = বন্ধ করে) খুব খারাপ ধারণা। এটি দ্রুত হবে কিনা তা পরীক্ষা করে নেওয়া কার্যকর হতে পারে তবে প্রোডাকশন কোডে কখনও এ জাতীয় কৌশল ব্যবহার করা উচিত নয়।

পরিবর্তে - আপনার ক্যোয়ারীর বিশ্লেষণ ব্যাখ্যা করুন, এটি পড়ুন এবং পোস্টগ্র্রেএসকিউএল কেন খারাপ (আপনার মতে) পরিকল্পনাটি বেছে নেয় তা সন্ধান করুন।

ওয়েবে এমন সরঞ্জাম রয়েছে যা বিশ্লেষণের আউটপুট বিশ্লেষণে পড়তে সহায়তা করে - এর মধ্যে একটি হ'ল ব্যাখ্যা.ডেপস.কম - আমার লেখা।

আরেকটি অপশনটি #postgresql চ্যানেল যোগদানের হয় freenode IRC নেটওয়ার্ক, এবং ছেলেরা সাথে কথা তোমাদের সাহায্য করার - যেমন ক্যোয়ারী নিখুঁত "একটি প্রশ্ন জিজ্ঞাসা, উত্তর সুখী হতে হবে" একটি বিষয় নয়। এটি আরও অনেক কথোপকথনের মতো, যাচাই করার জন্য অনেক কিছু রয়েছে এবং অনেক কিছু শিখতে হবে।


2

সাবগ্যুরিতে সেকস্ক্যান যুক্ত OFFSET 0করতে পোস্টগ্রাসকে চাপ দেওয়ার কৌশল রয়েছে

বড় / বিশাল টেবিলগুলির লিঙ্ক করার অনুরোধগুলি অনুকূলকরণের জন্য এটি কার্যকর যখন আপনার কেবলমাত্র প্রথম এন / শেষ উপাদানগুলি দরকার।

বলুন যে আপনি 100 / (বা তার বেশি) এন্ট্রিযুক্ত একাধিক টেবিলের সাথে জড়িত প্রথম / শেষ 20 উপাদানগুলির সন্ধান করছেন, বিন্দু নির্মান / আপনি যেটি সন্ধান করছেন তা প্রথম 100 বা 1000 এ থাকা সমস্ত ডেটাতে সমস্ত ক্যোয়ারিকে সংযুক্ত করে না এন্ট্রি। উদাহরণস্বরূপ, এই দৃশ্যে, এটি ক্রমিক স্ক্যান করতে 10x এরও বেশি দ্রুত হতে পারে।

দেখুন কীভাবে আমি পোস্টগ্রিসকে সাবকিউর ইনলাইন করা থেকে আটকাতে পারি?


দুর্দান্ত কৌশল। যদিও একটি ভাল অপ্টিমাইজার অবশ্যই অফসেট 0 :-) অপ্টিমাইজ করা উচিত
Guido Leenders
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.