PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पोस्टग्रेज में Seq स्कैन और बिटमैप हीप स्कैन में क्या अंतर है?

http://www.postgresql.org/docs/8.2/static /use-explain.html

मूल रूप से, एक अनुक्रमिक स्कैन वास्तविक पंक्तियों में जा रहा है, और पंक्ति 1 से पढ़ना शुरू करें, और तब तक जारी रखें जब तक कि क्वेरी संतुष्ट न हो जाए (यह पूरी तालिका नहीं हो सकती है, उदाहरण के लिए, सीमा के मामले में)

बिटमैप हीप स्कैन का मतलब है कि PostgreSQL को लाने के लिए पंक्तियों का एक छोटा सबसेट मिला है (उदाहरण के लिए, एक इंडेक्स से), और केवल उन पंक्तियों को लाने जा रहा है। यह निश्चित रूप से बहुत अधिक मांग वाला होगा, इसलिए यह तभी तेज होता है जब इसे पंक्तियों के एक छोटे उपसमुच्चय की आवश्यकता होती है।

एक उदाहरण लें:

create table test (a int primary key, b int unique, c int);
insert into test values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5);

अब, हम आसानी से एक seq स्कैन प्राप्त कर सकते हैं:

explain select * from test where a != 4

                       QUERY PLAN                        
---------------------------------------------------------
 Seq Scan on test  (cost=0.00..34.25 rows=1930 width=12)
   Filter: (a <> 4)

इसने क्रमिक स्कैन किया क्योंकि यह अनुमान लगाता है कि यह तालिका के विशाल बहुमत को हथियाने वाला है; ऐसा करने की कोशिश करना (बल्कि एक बड़े, बिना खोजे पढ़ने के) मूर्खतापूर्ण होगा।

अब, हम अनुक्रमणिका का उपयोग कर सकते हैं:

explain select * from test where a = 4 ;
                              QUERY PLAN                              
----------------------------------------------------------------------
 Index Scan using test_pkey on test  (cost=0.00..8.27 rows=1 width=4)
   Index Cond: (a = 4)

और अंत में, हम कुछ बिटमैप संचालन प्राप्त कर सकते हैं:

explain select * from test where a = 4 or a = 3;
                                  QUERY PLAN                                  
------------------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=8.52..13.86 rows=2 width=12)
   Recheck Cond: ((a = 4) OR (a = 3))
   ->  BitmapOr  (cost=8.52..8.52 rows=2 width=0)
         ->  Bitmap Index Scan on test_pkey  (cost=0.00..4.26 rows=1 width=0)
               Index Cond: (a = 4)
         ->  Bitmap Index Scan on test_pkey  (cost=0.00..4.26 rows=1 width=0)
               Index Cond: (a = 3)

हम इसे इस प्रकार पढ़ सकते हैं:

  1. उन पंक्तियों का बिटमैप बनाएं जिन्हें हम a=4 के लिए चाहते हैं। (बिटमैप इंडेक्स स्कैन)
  2. उन पंक्तियों का बिटमैप बनाएं जिन्हें हम a=3 के लिए चाहते हैं। (बिटमैप इंडेक्स स्कैन)
  3. या दो बिटमैप एक साथ (बिटमैपया)
  4. उन पंक्तियों को तालिका में देखें (बिटमैप हीप स्कैन) और यह सुनिश्चित करने के लिए जांचें कि a=4 या a=3 (cond फिर से जांचें)

[हां, ये क्वेरी योजनाएं बेवकूफी भरी हैं, लेकिन ऐसा इसलिए है क्योंकि हम test . का विश्लेषण करने में विफल रहे हैं अगर हमने इसका विश्लेषण किया होता, तो वे सभी क्रमिक स्कैन होते, क्योंकि इसमें 5 छोटी पंक्तियाँ होती हैं]




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. R . के साथ PostgreSQL में बड़े data.frame को सहेजना

  2. त्रुटि फ़ंक्शन to_date (समय क्षेत्र के बिना टाइमस्टैम्प, अज्ञात) प्राप्त करना मौजूद नहीं है

  3. Postgresql enum क्या फायदे और नुकसान हैं?

  4. कैसे Acosd () PostgreSQL में काम करता है

  5. Postgresql सर्वर रिमोट कनेक्शन