আমি কীভাবে পুনরাবৃত্ত সিটিইর কার্ডিনালিটিটি 'ইঙ্গিত' করব?


10

আমি নিম্নলিখিত রিকার্সিভ সিটিইকে একটি সর্বনিম্ন উদাহরণ হিসাবে ব্যবহার করছি, তবে সাধারণভাবে, অপ্টিমাইজারটি পুনরাবৃত্ত সিটিইর জন্য ডিফল্ট 'অনুমানযুক্ত' কার্ডিনালিটি ব্যবহার করতে হয়:

with recursive w(n) as ( select 1 union all select n+1 from w where n<5 ) select * from w;
/*
 n
---
 1
 2
 3
 4
 5
*/

explain analyze
with recursive w(n) as ( select 1 union all select n+1 from w where n<5 ) select * from w;
/*
                                                    QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
 CTE Scan on w  (cost=2.95..3.57 rows=31 width=4) (actual time=0.005..0.020 rows=5 loops=1)
   CTE w
     ->  Recursive Union  (cost=0.00..2.95 rows=31 width=4) (actual time=0.003..0.017 rows=5 loops=1)
           ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.001 rows=1 loops=1)
           ->  WorkTable Scan on w w_1  (cost=0.00..0.23 rows=3 width=4) (actual time=0.002..0.002 rows=1 loops=5)
                 Filter: (n < 5)
                 Rows Removed by Filter: 0
*/

উপরোক্ত পরিকল্পনায় rows=31আনুমানিক এবং rows=5প্রকৃত কার্ডিনালিটিগুলি নোট করুন । কিছু ক্ষেত্রে 100 টি অনুমান হিসাবে ব্যবহৃত হয়েছে বলে মনে হয়, অনুমানের পিছনে সঠিক যুক্তি সম্পর্কে আমি নিশ্চিত নই।

আমার আসল বিশ্বের সমস্যায়, দুর্বল কার্ডিনালিটির অনুমানটি দ্রুত 'নেস্টেড লুপস' পরিকল্পনাটি বাছাই করা থেকে বাধা দিচ্ছে। পুনরাবৃত্ত সিটিই এর আশেপাশে কাজ করার জন্য আমি কীভাবে 'ইঙ্গিত' করতে পারি the


5
এটি এমন অনেকগুলি ক্ষেত্রে একটি যেখানে পরিসংখ্যানের ইঙ্গিতগুলি সত্যিই খুব ভাল লাগবে। আছে COSTফাংশন উপর, কিন্তু না অনেক অন্য। আমি এটি পিএএসকিউএল-হ্যাকারদের উত্থাপনের পরামর্শ দিচ্ছি, তবে আপনি কেবল "ইঙ্গিত" বিতর্কের নবীন পুনরাবৃত্তিতে জড়িয়ে পড়বেন, প্রচণ্ড গরম বাতাসকে নষ্ট করে কিছু অর্জন করবেন না :-(
ক্রেগ রিঞ্জার

উত্তর:


8

আমি ইস্যুটি এইভাবে কাজ করেছি, তবে আমি আশা করছি যে এখানে খুব কম দুরত্বের উপায় রয়েছে:

explain analyze
with recursive w(n) as ( select 1 union all select n+1 from w where n<5 )
select * from w limit (select count(*) from w);
/*
                                                    QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
 Limit  (cost=3.66..3.72 rows=3 width=4) (actual time=0.032..0.034 rows=5 loops=1)
   CTE w
     ->  Recursive Union  (cost=0.00..2.95 rows=31 width=4) (actual time=0.003..0.019 rows=5 loops=1)
           ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual time=0.000..0.000 rows=1 loops=1)
           ->  WorkTable Scan on w w_1  (cost=0.00..0.23 rows=3 width=4) (actual time=0.002..0.002 rows=1 loops=5)
                 Filter: (n < 5)
                 Rows Removed by Filter: 0
   InitPlan 2 (returns $2)
     ->  Aggregate  (cost=0.70..0.71 rows=1 width=0) (actual time=0.029..0.030 rows=1 loops=1)
           ->  CTE Scan on w w_2  (cost=0.00..0.62 rows=31 width=0) (actual time=0.005..0.025 rows=5 loops=1)
   ->  CTE Scan on w  (cost=0.00..0.62 rows=31 width=4) (actual time=0.000..0.002 rows=5 loops=1)
*/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.