PostgreSQL এ যৌগিক সূচীতে কলামগুলির ক্রম (এবং ক্যোয়ারী ক্রম)


10

আমার কাছে 50K সারি সহ একটি টেবিল রয়েছে। এটি আসলে একটি পোস্টজিআইএস টেবিল।

ক্যোয়ারিতে 4 টি অংশ রয়েছে (1 বাধ্যতামূলক) (3 টি ptionচ্ছিক)

  1. ছেদযুক্ত বাক্স (একটি ভূগোলের আয়তক্ষেত্র) 4 লম্বা, দীর্ঘ (আমি st_intersects ব্যবহার করি) সহ [আবশ্যক]
  2. তারিখের ক্ষেত্রে তারিখের সীমা (সর্বনিম্ন, সর্বাধিক)
  3. ফাইল টাইপ (বর্তমানে 8 টি পাঠ্য মানগুলির একটি সেট) IN (.....) ব্যবহার করছে তবে প্রয়োজনে আমি এটি একটি টেম্প টেবিল তৈরি করতে পারি। আমি দেখছি অনেক লোক IN পছন্দ করে না।
  4. দেশ (একটি পাঠ্য মান)।

আমি প্রায় 100 - 4,000 সারি প্রত্যাশা করি

আমি যদি টেবিলের উপর একটি যৌগিক সূচক তৈরি করি তবে আমার প্রথমে কোন কলামটি ব্যবহার করা উচিত। জরিমানাযুক্ত দানা সম্ভবত অবস্থান (তথ্য সারা বিশ্বে ছড়িয়ে পড়ে)। আমার কাছে এটি বর্তমানে জিআইএসটি সূচক হিসাবে রয়েছে।

অন্যান্য সূচকগুলি বিটিআরই হবে।

আমার অন্তর্নিহিততা সূক্ষ্ম দানাদার ব্যবহার করুন, এবং অবশ্যই শেষ। যেমন এখানে প্রায় 12 টি ফাইল ধরণের রয়েছে, সুতরাং এটি সূচকের জন্য খুব বড় বালতি হবে।

পোস্টগ্রিসএসকিউএল এবং পোস্টজিআইএস গুরুরা (যারা সিস্টেমের অভ্যন্তরীণগুলি জানেন) কী বলে?


হালনাগাদ:

আমাকে এই প্রশ্নটি তীক্ষ্ণ করা যাক।

  1. আমি চাই না যে আমার উচিত কাজটি কাউকে করা উচিত। আমি আপনার সময় খুব শ্রদ্ধা। সুতরাং আমি পরে বিশ্লেষণের ব্যাখ্যাটিতে যাব।
  2. আমি যা খুঁজছিলাম তা হ'ল কিছু পয়েন্টার এবং টিপস এবং গাইডলাইন।
  3. আমি এই দুর্দান্ত সামান্য পোস্টটি পড়েছি: https://devcenter.heroku.com/articles/postgresql-indexes#manages- এবং- maintaining- সূচকগুলি সম্পর্কে সূচকগুলি
  4. আমি সাধারণত যা করি তা হ'ল 4 টি পৃথক সূচক তৈরি করা (জিও-বাক্স, দেশের নাম, ফাইল_প্রকার, এবং তারিখ) তবে একটি যৌগিক ক্যোয়ারী কী করবে তা দেখতে চাই।

এই অনুমানগুলির মধ্যে কোনওটি ভুল হলে আমাকে বলুন। (আমি যৌগিক সূচকগুলির ধারণাটিতে বেশ নতুন)

  1. অর্ডার গুরুত্বপূর্ণ। প্রথম সূচক হিসাবে বেছে নিন যা সারিগুলিকে সর্বাধিক কেটে ফেলবে (আমার ক্ষেত্রে অবস্থান (ভূগোল) যা একটি সাধারণ বহুভুজ বা বহু-বহুভুজ সবচেয়ে ভাল করবে)।
  2. কখনও কখনও প্রশ্নগুলি সূচকগুলি এড়িয়ে যায়। তবে যদি আমি কী (# 1, # 2, # 3, # 4) দিয়ে একটি যৌগিক ক্যোয়ারী তৈরি করি তবে ব্যবহারকারী যদি # 1, # 3 এর জন্য জিজ্ঞাসা করে এমন কিছু তৈরি করে তবে পরিকল্পনাকারী এখনও একক যৌগিক ক্যোয়ারী ব্যবহার করবে, যেহেতু তারা আদেশ করে রক্ষণাবেক্ষণ করা হয়.
  3. সাধারণত আমি তিনটি বিটিআরই কোয়েরি তৈরি করি এবং একটি জিআইএসটি (ভূগোলের ধরণের জন্য)। পোস্টজিআইএস একাধিক সূচক-প্রকারের মিশ্রণ তৈরি করে না। সুতরাং আমাকে যৌগিক সূচক জিআইএসটি ব্যবহার করতে হবে। তবে এতে জিনিসগুলিকে আঘাত করা উচিত নয়।
  4. আমি যদি কিছু অতিরিক্ত যৌগিক বা একক মান সূচক তৈরি করি তবে পরিকল্পনাকারী সবচেয়ে বুদ্ধিমান একটি বেছে নেওয়ার জন্য যথেষ্ট স্মার্ট .....
  5. দেশের নামের প্রায় 250 টি পৃথক মান থাকতে পারে এবং স্পষ্টতই অবস্থানের সাথে জড়িত (জিওবক্স) তবে সারি আকারটি কাটানোর জন্য পরবর্তী সেরা সূচক যদি ফাইল_প্রকার হয় তবে আমার এটি পরবর্তী ব্যবহার করা উচিত। আমি আশা করি না যে ব্যবহারকারীরা প্রায়শই তাদের জিজ্ঞাস্য সেটে দেশ বা তারিখ ব্যবহার করবেন।
  6. 4 কীগুলির একটি যৌগিক সূচক তৈরি করার বিষয়ে আমাকে চিন্তার দরকার নেই, তাত্পর্যপূর্ণ আকারের আকারের আকার বাড়িয়ে তুলবে। উদাহরণস্বরূপ, যদি একটি-কী সূচকটি পারফরম্যান্স বৃদ্ধির 90% হয়, তবে এটি আরও যৌগিক করে তুলতে আরও 3 টি আইটেম যুক্ত করতে ক্ষতি করবে না। বিপরীতে, আমার সত্যই উভয় সূচক তৈরি করা উচিত। একটি একক ভূগোল সূচক এবং একটি যৌগিক সূচক এবং পরিকল্পনাকারীকে কোনটি সেরা তা নির্ধারণ করুন এবং এটি সূচীকরণের সারণির আকার বিবেচনা করবে।

আবার, আমি কাউকেই আমার সমাধানটি ডিজাইন করতে বলছি না, আমি অন্যের কাজকে শঙ্কিত করি না। তবে আমার এমন স্টাফের দরকার আছে যা পোস্টগ্র্যাসকিউএল ডকুমেন্টেশন আমাকে বাস্তবায়ন সম্পর্কে বলে না

[আমার কাছে এখনও প্রদর্শন করার জন্য কোনও স্পষ্ট ফলাফল না পাওয়ার কারণটি হ'ল আমাকে 24M সারির সারণি থেকে এই 25 কে সারি টেবিলটি তৈরি করতে হবে। আমি যা ভেবেছিলাম তার চেয়ে বেশি সময় নিচ্ছে। আমি 1,000 টি আইটেম গ্রুপগুলিতে জিনিসগুলিকে ক্লাস্টার করছি এবং 25 কে সারি সারণির বিপরীতে ব্যবহারকারীকে জিজ্ঞাসা দিচ্ছি। তবে আমার পরের প্রশ্নটি মাস্টার 25 এম সারি টেবিলের কাছে গিয়ে জিনিসগুলি টেনে আনতে সেই প্রশ্নের ফলাফল ব্যবহার করে জড়িত থাকবে এবং সেখানেই যৌগিক সূচকটির কার্য সম্পাদন সত্যিই এইচআইটি করবে]।


নীচে নমুনা কোয়েরি:


SELECT
    public.product_list_meta_mv.cntry_name       AS country,
    public.product_list_meta_mv.product_producer AS producer,
    public.product_list_meta_mv.product_name     AS prod_name,
    public.product_list_meta_mv.product_type     AS ptype,
    public.product_list_meta_mv.product_size     AS size,
    ST_AsGeoJSON(public.product_list_meta_mv.the_geom, 10, 2)          AS outline
FROM
    public.product_list_meta_mv 
WHERE
    public.product_list_meta_mv.cntry_name = 'Poland' 
AND
    ST_Intersects(public.product_list_meta_mv.the_geom,
    st_geogfromtext('SRID=4326;POLYGON((21.23107910156250 51.41601562500000,
                                        18.64379882812500 51.41601562500000,
                                        18.64379882812500 48.69415283203130,
                                        21.23107910156250 48.69415283203130,
                                        21.23107910156250 51.41601562500000))')) 
AND (date >= '1/2/1900 5:00:00 AM' 
 AND date <= '2/26/2014 10:26:44 PM')
AND (public.product_list_meta_mv.product_type in
    ('CIB10','DTED0','DTED1','DTED2','CIB01','CIB05')) ;

বিশ্লেষণের ফলাফলগুলি ব্যাখ্যা করুন (আমি কোনও যৌগিক সূচকগুলিতে রাখিনি, এবং যে গতিটি আমি দেখছি তা থেকে আমার প্রয়োজন হবে কিনা তা আমি জানি না)।

"Bitmap Heap Scan on catalog_full cat  (cost=4.33..37.49 rows=1 width=7428) (actual time=1.147..38.051 rows=35 loops=1)"
"  Recheck Cond: ('0103000020E61000000100000005000000000000005838354000000000AEB0494000000000A0A7324000000000AEB0494000000000A0A73240000000006C5D48400000000058383540000000006C5D4840000000005838354000000000AEB04940'::geography && outline)"
"  Filter: (((type)::text = ANY ('{CADRG,CIB10,DTED1,DTED2}'::text[])) AND (_st_distance('0103000020E61000000100000005000000000000005838354000000000AEB0494000000000A0A7324000000000AEB0494000000000A0A73240000000006C5D48400000000058383540000000006C5D4840000000005838354000000000AEB04940'::geography, outline, 0::double precision, false) < 1e-005::double precision))"
"  Rows Removed by Filter: 61"
"  ->  Bitmap Index Scan on catalog_full_outline_idx  (cost=0.00..4.33 rows=8 width=0) (actual time=0.401..0.401 rows=96 loops=1)"
"        Index Cond: ('0103000020E61000000100000005000000000000005838354000000000AEB0494000000000A0A7324000000000AEB0494000000000A0A73240000000006C5D48400000000058383540000000006C5D4840000000005838354000000000AEB04940'::geography && outline)"
"Total runtime: 38.109 ms"

EXPLAIN ANALYZE SELECT pid,product_name,type,country,date,size,cocom,description,egpl_date,ST_AsGeoJSON(outline, 10, 2) AS outline 
FROM portal.catalog_full AS cat 
WHERE ST_Intersects(st_geogfromtext('SRID=4326;POLYGON((21.2200927734375 51.38031005859375, 18.65478515625 51.38031005859375, 18.65478515625 48.7298583984375, 21.2200927734375 48.7298583984375, 21.2200927734375 51.38031005859375))'), cat.outline) 
AND (cat.type in ('CADRG','CIB10','DTED1','DTED2'))

2
দয়া করে আসল জিজ্ঞাসা সরবরাহ করুন।
ypercubeᵀᴹ

"3 alচ্ছিক" এর অর্থ কি ক্যোয়ারিতে 8 টি ভিন্ন ভিন্নতা থাকতে পারে (2,3,4 টি বিকল্প সক্রিয় করা আছে কি না তার উপর নির্ভর করে)?
ypercubeᵀᴹ

4 টি এবং WHERE এর উপাদান রয়েছে। St_intersects এ প্রয়োজন হয়, অন্যরা সেখানে থাকতে পারে, বা তারা নাও পারে। তবে তারা যেখানে উপস্থিত রয়েছে আমি সেখানে মামলাটি মোকাবেলা করতে চাই।

2
আমি প্রশ্নটি ডিবিএতে স্থানান্তরিত করার পক্ষে ভোট দিয়েছি, এটি একাধিক পরিসরের শর্তাবলী সহ একটি জটিল প্রশ্ন।
ypercubeᵀᴹ

1
EXPLAIN ANALYZEক্যোয়ারির জন্য দেখান ।
ক্রেগ রিঞ্জার

উত্তর:


4

আমার কাজের অংশ হিসাবে আমি বেশ বড় পোস্টগ্রিএসকিউএল ডাটাবেস বজায় রাখি (ডিস্কে প্রায় 120 গিগাবাইট, বেশ কয়েকটি বহু মিলিয়ন-সারি টেবিল) এবং কীভাবে প্রশ্নগুলির গতি বাড়ানোর জন্য কয়েকটি কৌশল সংগ্রহ করেছি। প্রথমে আপনার অনুমান সম্পর্কে কিছু মন্তব্য:

  1. হ্যাঁ, ক্রমটি গুরুত্বপূর্ণ, তবে এটি প্রথম প্রথম যা সত্যিই আলাদা, বাকিগুলি দ্বিতীয় শ্রেণির সূচক es
  2. আমি নিশ্চিত নই যে এটি সবসময় উভয়ই ব্যবহার করবে, আমার অনুমান যে ক্যোয়ারী পরিকল্পনাকারী # 1 ব্যবহার করবেন, তারপরে বাকীগুলি দিয়ে কিছু চালাক করুন।
  3. জিআইএসটি নিয়ে আমার কোনও অভিজ্ঞতা নেই।
  4. হ্যাঁ, প্রথমে সমস্ত সূচী যুক্ত করুন, সর্বাধিক ব্যবহৃত হয় এবং কী সেরা অভিনয় দেয় তা দেখুন।
  5. আমি উভয়ের চেষ্টা করে যা সেরা কাজ করে তা পরিমাপ করব measure বিভিন্ন উপ-কেনাসমূহ, সম্ভবত দেশ এবং এক সাথে এক সাথে লেখার চেষ্টা করুন, তারপর ছেদ-জিজ্ঞাসার সাথে যোগ দিন। আইএন-ক্লজগুলির কোনও কার্যকারিতা সমস্যা আমি লক্ষ্য করি নি, যতক্ষণ না IN-তালিকাটি হাজার হাজার উপাদান দীর্ঘ নয়। আমার অনুমান যে উপলব্ধ ইনপুট মানদণ্ডের উপর নির্ভর করে বিশেষভাবে টিউন করা কয়েকটি ভিন্ন প্রশ্নগুলি সেরা ফলাফল দেবে।
  6. আমি 4-উপায় সূচক তৈরির বিরুদ্ধে পরামর্শ দেব। একটি তৈরি করার চেষ্টা করুন এবং তারপরে আকারটি যাচাই করুন, তারা সত্যিই বিশাল আকার পেতে পারে। আমার অভিজ্ঞতায়, চারটি 1-কী সূচকগুলি একক 4-ওয়ে সূচক হিসাবে প্রায় দ্রুত হয়েছে। একটি কৌশল যা কিছু নির্দিষ্ট প্রশ্নের জন্য সুন্দরভাবে কাজ করে তা হ'ল আংশিক সূচকগুলি, যেমন এর মতো:

    টেবিল_এক্সে ইন্ডেক্স তৈরি করুন (কী 1, কী 2, কী 3) যেখানে কিছু_x_column = 'XXXX';

কোন সূচকগুলি যুক্ত করতে বা মুছতে হবে তা অনুসন্ধানের জন্য আমি প্রশ্নের সাথে আমার .psqlrc-file এ এলিয়াস তৈরি করেছি। গিটহাব: .sqlএগুলি দেখতে দ্বিধা বোধ করুন

আমি: seq_scans এবং: বিগ টেবিলগুলি অনেকগুলি ব্যবহার করি এবং তারপরে সারণী সম্পর্কে বিশদ জানতে table d টেবিল_নামটি ব্যবহার করি। কিছু পরিবর্তন করার পরে পরিসংখ্যানগুলি পুনরায় সেট করতে ভুলবেন না, pg_stat_reset () নির্বাচন করুন;


1
এগুলি দুর্দান্ত টিপস। আমি আপনার পরামর্শ নিয়েছি এবং এরপরে আমরা রক্ষণাবেক্ষণ করা (43 মিলিয়ন সারি) আরও বড় টেবিলটিতে একটি পরীক্ষা করতে এটি ব্যবহার করেছি। ফলাফলগুলি এখানে রয়েছে: dba.stackexchange.com/questions/61084/…
ডাঃ ওয়াইএসজি

1

আমি মনে করি যে জিনিসটি সম্ভবত সবচেয়ে বেশি সাহায্য করবে (যদি কিছু থাকে) গিস্ট সূচকগুলিতে 2 র্থ কলাম হিসাবে product_type যুক্ত করা হবে। তবে আপনার টিপিকাল / সমস্যাযুক্ত প্রশ্নের জন্য কতগুলি সারি AND শর্তের সাথে (বিচ্ছিন্নভাবে) মেলে তা না জেনে আমরা কেবল অনুমান করতে পারি।

আমি যখন এটির কাছে পৌঁছেছি তখন প্রথম কাজটি সহজতর আকারে ক্যোয়ারি চালানো হয় যেখানে যেখানে ক্লাসটির কেবল একটি শর্ত থাকে, প্রত্যেকেই বিশ্লেষণ বিশ্লেষণের আওতায় পালটে নেওয়া হয়। প্রতিটি জন্য আনুমানিক সারি এবং আসল সারি উভয় দেখুন।


আমার আপডেটটি উপরের দিকে দেখুন, তবে আমি মনে করি আপনি আমাকে ভাল নেতৃত্ব দিচ্ছেন, সূচী ক্রমগুলি অর্ডার করার বিষয়ে ভাবুন যার মাধ্যমে সারি আউটপুটটি সবচেয়ে দ্রুত কমে যায়। এটা কি সঠিক?
ডাঃ ওয়াইএসজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.