একটি অভিব্যক্তিতে একটি সামগ্রিক লাইক কোয়েরি গতি বাড়ানোর জন্য একটি সূচক কীভাবে তৈরি করবেন?


20

আমি শিরোনামে ভুল প্রশ্ন জিজ্ঞাসা করা হতে পারে। এখানে তথ্যগুলি:

আমাদের গ্রাহক পরিষেবা লোকেরা আমাদের জ্যাঙ্গো-ভিত্তিক সাইটের প্রশাসনিক ইন্টারফেসে গ্রাহক দেখার জন্য ধীর সাড়া দেওয়ার সময় সম্পর্কে অভিযোগ করে আসছে।

আমরা পোস্টগ্রিস 8.4.6 ব্যবহার করছি। আমি ধীর অনুসন্ধানগুলি লগ করতে শুরু করেছি এবং এই অপরাধীকে আবিষ্কার করেছি:

SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')

এই কোয়েরিটি চালাতে 32 সেকেন্ডের বেশি সময় নিচ্ছে। এখানে জিজ্ঞাসা পরিকল্পনা সরবরাহ করেছেন:

QUERY PLAN
Aggregate  (cost=205171.71..205171.72 rows=1 width=0)
  ->  Seq Scan on auth_user  (cost=0.00..205166.46 rows=2096 width=0)
        Filter: (upper((email)::text) ~~ '%DEYK%'::text)

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

CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))

আমি কি ভুল করছি? আমি এই ক্যোয়ারীটি কীভাবে দ্রুত করব?

উত্তর:


21

পোস্টগ্র্রেএসকিউএল 8.4-এLIKE / ILIKEএর জন্য কোনও সূচী সমর্থন নেই - বাম অ্যাঙ্কার্ড অনুসন্ধান শর্তাদি বাদে ।

যেহেতু পোস্টগ্রি 9.1 অতিরিক্ত মডিউল pg_trgmজিন এবং সারকথা trigram সূচকের সমর্থনের জন্য অপারেটর শ্রেণীর প্রদান করে LIKE/ ILIKEঅথবা নিয়মিত এক্সপ্রেশন (অপারেটার ~এবং বন্ধুদের)। প্রতি ডাটাবেস ইনস্টল করুন:

CREATE EXTENSION pg_trgm;

জিএন সূচক উদাহরণ:

CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);

সম্পর্কিত:


2
এটি আসলে সঠিক উত্তর।
ভনপেট্রেশেভ

9

আপনার সূচীটি আপনার ম্যাচের শুরুতে '%' এর কারণে সহায়তা করবে না - একটি বিটিআরই সূচক কেবল আপনার উপক্রমের সাথে উপসর্গ এবং ওয়াইল্ডকার্ডের সাথে মেলে তবে তার সন্ধানের জন্য কোনও স্থির উপসর্গ নেই।

এজন্য এটি একটি টেবিল স্ক্যান করছে এবং ক্যোয়ারী স্ট্রিংয়ের বিপরীতে প্রতিটি রেকর্ড মিলছে।

আপনি সম্ভবত এই মুহুর্তে লাইক দিয়ে সাবস্ট্রিং অনুসন্ধান না করে একটি সম্পূর্ণ পাঠ্য সূচী এবং পাঠ্য মেলা অপারেটরগুলি ব্যবহার করা উচিত। ডকুমেন্টেশনে আপনি সম্পূর্ণ পাঠ্য অনুসন্ধানে আরও সন্ধান করতে পারেন:

http://www.postgresql.org/docs/8.4/static/textsearch-intro.html

আসলে আমি এই পৃষ্ঠাটি থেকে লক্ষ্য করেছি যে লাইক দৃশ্যত কখনই সূচকগুলি ব্যবহার করে না, যা আমার কাছে বিচিত্র মনে হয় কারণ এটি একটি বিটিআরই সূচক ব্যবহার করে নন-ওয়াইল্ডকার্ড উপসর্গগুলি সমাধান করতে সক্ষম হওয়া উচিত able কয়েকটি দ্রুত পরীক্ষার পরামর্শ দেয় যে ডকুমেন্টেশন সম্ভবত সঠিক, তবে এই ক্ষেত্রে আপনি কোয়েরিটি সমাধান করতে LIKE ব্যবহার করার সময় কোনও পরিমাণ সূচী সহায়তা করতে যাচ্ছেন না।


এটাই আমার ভয় ছিল। অন্য কোন সূচক আছে যা সাহায্য করবে? যেমনটি আমি বলেছি, আমি নিজেই ক্যোয়ারীটিকে প্রভাবিত করতে আমার ক্ষমতাকে কিছুটা বাঁধা করছি।
ডেভিড আইক

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

ঠিক আছে, LIKE এবং পূর্ণ-পাঠ্য সূচকে নিয়ে কিছুটা গবেষণা করার পরে এবং আমি আপনার বক্তব্যটি দেখতে শুরু করি।
ডেভিড আইক

আপাতত, আমি শীর্ষস্থানীয় ওয়াইল্ডকার্ড দমন করার একটি উপায় খুঁজে পেয়েছি। এটি প্রমাণিত হয় যে আপনি যদি উপযুক্ত অপারেটর শ্রেণীর সাথে সূচক তৈরি করেন তবে আপনি LIKE সহ একটি সূচক ব্যবহার করতে পারেন । দস্তাবেজগুলি এখানে রয়েছে: postgresql.org/docs/8.4/static/indexes-opclass.html
ডেভিড আইক

এছাড়াও, ফোলা জন্য আপনার ডিবি চেক করুন। যদি আপনি এই টেবিলটিতে প্রচুর ফোটাতে পান তবে এটি সিক স্ক্যান করতে অনেক সময় লাগবে। যদি আপনার কিছুটা সময় হয় তবে কেবল প্রাথমিক কীতে এটি ক্লাস্টার করুন এবং দেখুন এটি দ্রুত হয় কিনা। যদি আপনি ব্লোটের জন্য যাচাই করতে চান, আপনি বিশ্লেষণ চালাতে পারেন তবে ক্যোয়ারীটি এখানে চালান: wiki.postgresql.org/wiki/Show_datedia_bloat । আরও সঠিক মানগুলির জন্য, পৃষ্ঠাটির নীচে দেখুন।
স্কট মার্লো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.