পোস্টগ্র্রেসকে যখন অন্যথায় অনুক্রমিক স্ক্যান করার জন্য জোর দেওয়া হয় তখন আমি কীভাবে একটি সূচক ব্যবহার করতে বাধ্য করব?
পোস্টগ্র্রেসকে যখন অন্যথায় অনুক্রমিক স্ক্যান করার জন্য জোর দেওয়া হয় তখন আমি কীভাবে একটি সূচক ব্যবহার করতে বাধ্য করব?
উত্তর:
ধরে নেওয়া যায় যে আপনি অনেক ডাটাবেসে পাওয়া সাধারণ "ইনডেক্স ইঙ্গিত" বৈশিষ্ট্যটি সম্পর্কে জিজ্ঞাসা করছেন, পোস্টগ্র্যাসকিউএল এমন বৈশিষ্ট্য সরবরাহ করে না। পোস্টগ্র্রেএসকিউএল টিম এই সচেতন সিদ্ধান্ত নিয়েছিল। পরিবর্তে কেন এবং আপনি কী করতে পারেন তার একটি ভাল ওভারভিউ এখানে পাওয়া যাবে । মূলত কারণগুলি হ'ল এটি একটি পারফরম্যান্স হ্যাক যা পরে আপনার ডেটা পরিবর্তনের সাথে সাথে আরও বেশি সমস্যা দেখা দেয়, অন্যদিকে পোস্টগ্র্যাসএসকিউএল এর অপ্টিমাইজার পরিসংখ্যানের ভিত্তিতে পরিকল্পনার পুনরায় মূল্যায়ন করতে পারে। অন্য কথায়, বর্তমানে একটি ভাল ক্যোয়ারী প্ল্যান কী হতে পারে সম্ভবত সর্বকালের জন্য একটি ভাল ক্যোয়ারী পরিকল্পনা হবে না এবং সূচি ইঙ্গিতগুলি সর্বকালের জন্য একটি নির্দিষ্ট ক্যোয়ারী পরিকল্পনা জোর করে।
খুব কট্টর হাতুড়ি হিসাবে, পরীক্ষার জন্য দরকারী, আপনি enable_seqscan
এবং enable_indexscan
পরামিতি ব্যবহার করতে পারেন । দেখা:
এগুলি চলমান উত্পাদন ব্যবহারের জন্য উপযুক্ত নয় । আপনার যদি ক্যোয়ারী পরিকল্পনা পছন্দ নিয়ে সমস্যা থাকে তবে আপনার ক্যোয়ারি পারফরম্যান্স সংক্রান্ত সমস্যাগুলি ট্র্যাক করার জন্য ডকুমেন্টেশনটি দেখতে হবে । শুধু enable_
প্যারাম সেট করে চলে না।
সূচকটি ব্যবহারের জন্য যদি আপনার কাছে খুব ভাল কারণ না থাকে তবে পোস্টগ্র্রেস সঠিক পছন্দ করতে পারে। কেন?
এই পুরানো নিউজগ্রুপ পোস্টটিও দেখুন ।
সম্ভবত ব্যবহারের একমাত্র বৈধ কারণ
set enable_seqscan=false
আপনি যখন ক্যোয়ারী লিখছেন এবং তাড়াতাড়ি দেখতে চান যে টেবিলগুলিতে প্রচুর পরিমাণে ডেটা থাকত তবে কোয়েরি প্ল্যানটি আসলে কী হবে। অথবা অবশ্যই যদি আপনার দ্রুত জিজ্ঞাসার প্রয়োজন হয় যে আপনার ক্যোয়ারী সূচকটি ব্যবহার করছে না কেবল ডাটাবেসটি খুব ছোট।
set enable_seqscan=false
, আপনার ক্যোয়ারী চালান, এবং তারপরে set enable_seqscan=true
সঠিকভাবে পোস্টগ্র্যাস্কেল ফিরে পেতে দ্রুত চালান (এবং স্পষ্টতই প্রযোজনায় এটি কেবলমাত্র উন্নয়নে করবেন না!)
SET SESSION enable_seqscan=false
কেবল নিজের উপর প্রভাব ফেলতে
কখনও কখনও 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
your_wanted_index
, এটি এমন হতে পারে যে পোস্টগ্রেস্কেল ইঞ্জিন পরিবর্তে কেবল একটি সিকোয়েন্স / প্রাথমিক কী স্ক্যান করবে। উপসংহার - পোস্টগ্রেএসকিএল সার্ভারের জন্য কিছু সূচক ব্যবহারকে বাধ্য করার জন্য 100% নির্ভরযোগ্য পদ্ধতি নেই।
where
শর্ত না থাকে তবে দুটি টেবিল বা যোগদান এবং পোস্টগ্রিস সূচকটি নিতে ব্যর্থ।
এই সমস্যাটি সাধারণত তখন ঘটে যখন সূচকের স্ক্যানের আনুমানিক ব্যয় খুব বেশি এবং সঠিকভাবে বাস্তবতার প্রতিফলন ঘটায় না। এটি 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 এক্সটেনশনটিও ব্যবহার করতে চাইতে পারেন ।
নিজেই প্রশ্নটি খুব অবৈধ। জোর করে দেওয়া (উদাহরণস্বরূপ সক্ষম_সেকস্কান = বন্ধ করে) খুব খারাপ ধারণা। এটি দ্রুত হবে কিনা তা পরীক্ষা করে নেওয়া কার্যকর হতে পারে তবে প্রোডাকশন কোডে কখনও এ জাতীয় কৌশল ব্যবহার করা উচিত নয়।
পরিবর্তে - আপনার ক্যোয়ারীর বিশ্লেষণ ব্যাখ্যা করুন, এটি পড়ুন এবং পোস্টগ্র্রেএসকিউএল কেন খারাপ (আপনার মতে) পরিকল্পনাটি বেছে নেয় তা সন্ধান করুন।
ওয়েবে এমন সরঞ্জাম রয়েছে যা বিশ্লেষণের আউটপুট বিশ্লেষণে পড়তে সহায়তা করে - এর মধ্যে একটি হ'ল ব্যাখ্যা.ডেপস.কম - আমার লেখা।
আরেকটি অপশনটি #postgresql চ্যানেল যোগদানের হয় freenode IRC নেটওয়ার্ক, এবং ছেলেরা সাথে কথা তোমাদের সাহায্য করার - যেমন ক্যোয়ারী নিখুঁত "একটি প্রশ্ন জিজ্ঞাসা, উত্তর সুখী হতে হবে" একটি বিষয় নয়। এটি আরও অনেক কথোপকথনের মতো, যাচাই করার জন্য অনেক কিছু রয়েছে এবং অনেক কিছু শিখতে হবে।
সাবগ্যুরিতে সেকস্ক্যান যুক্ত OFFSET 0
করতে পোস্টগ্রাসকে চাপ দেওয়ার কৌশল রয়েছে
বড় / বিশাল টেবিলগুলির লিঙ্ক করার অনুরোধগুলি অনুকূলকরণের জন্য এটি কার্যকর যখন আপনার কেবলমাত্র প্রথম এন / শেষ উপাদানগুলি দরকার।
বলুন যে আপনি 100 / (বা তার বেশি) এন্ট্রিযুক্ত একাধিক টেবিলের সাথে জড়িত প্রথম / শেষ 20 উপাদানগুলির সন্ধান করছেন, বিন্দু নির্মান / আপনি যেটি সন্ধান করছেন তা প্রথম 100 বা 1000 এ থাকা সমস্ত ডেটাতে সমস্ত ক্যোয়ারিকে সংযুক্ত করে না এন্ট্রি। উদাহরণস্বরূপ, এই দৃশ্যে, এটি ক্রমিক স্ক্যান করতে 10x এরও বেশি দ্রুত হতে পারে।
দেখুন কীভাবে আমি পোস্টগ্রিসকে সাবকিউর ইনলাইন করা থেকে আটকাতে পারি?