লিমিটের সাথে ধীরে ধীরে অর্ডার দিন


11

আমার এই প্রশ্নটি রয়েছে:

SELECT * 
FROM location 
WHERE to_tsvector('simple',unaccent2("city"))
   @@ to_tsquery('simple',unaccent2('wroclaw')) 
order by displaycount

আমি এতে খুশি:

"Sort  (cost=3842.56..3847.12 rows=1826 width=123) (actual time=1.915..2.084 rows=1307 loops=1)"
"  Sort Key: displaycount"
"  Sort Method: quicksort  Memory: 206kB"
"  ->  Bitmap Heap Scan on location  (cost=34.40..3743.64 rows=1826 width=123) (actual time=0.788..1.208 rows=1307 loops=1)"
"        Recheck Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) @@ '''wroclaw'''::tsquery)"
"        ->  Bitmap Index Scan on location_lower_idx  (cost=0.00..33.95 rows=1826 width=0) (actual time=0.760..0.760 rows=1307 loops=1)"
"              Index Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) @@ '''wroclaw'''::tsquery)"
"Total runtime: 2.412 ms"

তবে আমি যখন লিমিটেড যুক্ত করি তখন এক্সিকিউশনটি 2 সেকেন্ডের বেশি সময় নেয়:

SELECT * 
FROM location 
WHERE to_tsvector('simple',unaccent2("city"))
   @@ to_tsquery('simple',unaccent2('wroclaw')) 
order by displaycount 
limit 20

ব্যাখ্যা করা:

"Limit  (cost=0.00..1167.59 rows=20 width=123) (actual time=2775.452..2775.643 rows=20 loops=1)"
"  ->  Index Scan using location_displaycount_index on location  (cost=0.00..106601.25 rows=1826 width=123) (actual time=2775.448..2775.637 rows=20 loops=1)"
"        Filter: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) @@ '''wroclaw'''::tsquery)"
"Total runtime: 2775.693 ms"

আমি মনে করি এটি অর্ডার বাই লিমিটের সাথে কিছু সমস্যা। আমি পোস্টগ্র্রেএসকিউএলকে কীভাবে সূচকটি ব্যবহার করতে বাধ্য করতে পারি এবং শেষে অর্ডারিং করতে পারি?

সাবকোয়ারি সাহায্য করে না:

SELECT * 
FROM (
    SELECT * 
    FROM location 
    WHERE to_tsvector('simple',unaccent2("city"))
       @@ to_tsquery('simple',unaccent2('wroclaw')) 
    order by displaycount
) t 
LIMIT 20;

বা:

SELECT * 
FROM (
    SELECT * 
    FROM location 
    WHERE to_tsvector('simple',unaccent2("city"))
       @@ to_tsquery('simple',unaccent2('wroclaw'))
) t 
order by displaycount 
LIMIT 20;

উত্তর:


12

আমার ধারণা এটি আপনার প্রশ্নের সমাধান করবে:

SELECT * 
FROM   location 
WHERE     to_tsvector('simple',unaccent2(city))
       @@ to_tsquery('simple',unaccent2('wroclaw')) 
ORDER  BY to_tsvector('simple',unaccent2(city))
       @@ to_tsquery('simple',unaccent2('wroclaw')) DESC
         ,displaycount 
LIMIT  20;

আমি শর্তটির WHEREপ্রথম উপাদান হিসাবে শর্তটি পুনরাবৃত্তি করি ORDER BY- যা যৌক্তিকভাবে অপ্রয়োজনীয়, তবে ক্যোয়ারের পরিকল্পনাকারীকে ধরে নিতে হবে এটি সূচক অনুসারে সারিগুলি প্রক্রিয়াকরণ করা ভাল location_displaycount_indexmore যা আরও ব্যয়বহুল বলে প্রমাণিত হয়।

অন্তর্নিহিত সমস্যাটি হ'ল ক্যোয়ারী পরিকল্পনাকারী স্পষ্টতই আপনার WHEREশর্তের নির্বাচন এবং / অথবা ব্যয়কে ভুলভাবে বিবেচনা করছেন । আমি কেন কেবল তা অনুমান করতে পারি।

আপনার কি অটোভ্যাকুয়াম চলছে - যা ANALYZEআপনার টেবিলে চালানোরও যত্ন নেওয়া উচিত ? এর মাধ্যমে, আপনার টেবিল-পরিসংখ্যানগুলি কি আপ টু ডেট আছে? আপনি চালানো হলে যে কোনও প্রভাব:

ANALYZE location;

এবং আবার চেষ্টা করো?

এটিও হতে পারে যে @@অপারেটরের নির্বাচনকে ভুল বোঝানো হচ্ছে। আমি ধারণা করব যে এটি যৌক্তিক কারণে অনুমান করা খুব কঠিন।


যদি আমার ক্যোয়ারী সমস্যার সমাধান না করে এবং সাধারণত অন্তর্নিহিত তত্ত্বটি যাচাই করতে এই দুটি জিনিসগুলির মধ্যে একটি করুন:

পরবর্তীটি কম অনুপ্রবেশকারী এবং কেবলমাত্র বর্তমান অধিবেশনকে প্রভাবিত করে। এটি পদ্ধতিগুলি ছেড়ে দেয় bitmap heap scanএবং bitmap index scanউন্মুক্ত, যা দ্রুত পরিকল্পনা দ্বারা ব্যবহৃত হয়।
তারপরে কোয়েরিটি আবার চালান।

বিটিডাব্লু: যদি তত্ত্বটি সঠিক হয়, আপনার প্রশ্নটি (আপনার এখন যেমন রয়েছে) এফটিএস শর্তে কম নির্বাচনী অনুসন্ধান শব্দটির সাথে অনেক দ্রুত হবে - আপনি যা আশা করতে পারেন তার বিপরীতে। চেষ্টা করে দেখুন


1
ক্যোয়ারি কাজ করে। সূচি স্ক্যান বন্ধ করে দেওয়াও কাজ করে। বিশ্লেষণ কাজ করে না। ব্যাপক উত্তরের জন্য আপনাকে অনেক ধন্যবাদ।
জিরি

0

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

সূচকগুলি ব্যবহারের জন্য বাধ্যতামূলকভাবে সাধারণত সিক্যুয়াল স্ক্যানগুলির ব্যবহার নিষ্ক্রিয় করে করা হয় (সক্ষম করুন_সেকস্কান = মিথ্যা)। তবে আপনার ক্ষেত্রে এটি অনুক্রমিক স্ক্যান করছে না এটি সীমাবদ্ধতার সাথে ক্যোয়ারির জন্য আলাদা সূচিতে স্যুইচ করে।

বিশ্লেষণটি যদি সহায়তা না করে তবে আপনি পোস্টগ্রেস্কল এর কোন সংস্করণটি ব্যবহার করছেন তা বলতে পারবেন না? এছাড়াও টেবিলে কয়টি সারি রয়েছে?


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