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

PostgreSQL में NULL का उपयोग नहीं कर रहा है अभी भी शीर्षलेख में एक पूर्ण बिटमैप का उपयोग करता है?

यह वास्तव में उससे कहीं अधिक जटिल है।

नल बिटमैप को पंक्ति में प्रति कॉलम एक बिट की आवश्यकता होती है, जिसे पूर्ण बाइट्स तक गोल किया जाता है। यह केवल तभी होता है जब वास्तविक पंक्ति में कम से कम एक NULL मान शामिल हो और उस स्थिति में पूरी तरह से आवंटित हो। NOT NULL बाधाओं का उस पर सीधा प्रभाव नहीं पड़ता है। (बेशक, यदि आपकी तालिका के सभी फ़ील्ड NOT NULL . हैं , कभी भी शून्य बिटमैप नहीं हो सकता।)

"हीप टुपल हेडर" (प्रति पंक्ति) 23 बाइट लंबा है। वास्तविक डेटा MAXALIGN . के गुणज से प्रारंभ होता है (अधिकतम डेटा संरेखण ) उसके बाद, जो आमतौर पर 64-बिट OS पर (32-बिट OS पर 4 बाइट्स) 8 बाइट्स होता है। निश्चित उत्तर पाने के लिए अपने PostgreSQL बाइनरी डीआईआर से रूट के रूप में निम्न कमांड चलाएँ:

./pg_controldata /path/to/my/dbcluster

Postgres 12 की एक विशिष्ट डेबियन-आधारित स्थापना पर जो होगा:

sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main

किसी भी तरह से, हेडर और डेटा की संरेखित शुरुआत के बीच एक फ्री बाइट है, जिसका उपयोग नल बिटमैप कर सकता है। जब तक आपकी तालिका में 8 या उससे कम स्तंभ हैं , NULL संग्रहण प्रभावी रूप से बिल्कुल मुफ़्त है (जहां तक ​​डिस्क स्थान का संबंध है)।

उसके बाद, एक और MAXALIGN (आमतौर पर 8 बाइट्स) एक अन्य (आमतौर पर) 64 क्षेत्रों को कवर करने के लिए अशक्त बिटमैप के लिए आवंटित किया जाता है। आदि।

यह कम से कम 8.4 - 12 संस्करणों के लिए मान्य है और संभवतः नहीं बदलेगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दिनांक सीमा के अनुसार SQL समूह

  2. मैं अगली चयन अभिव्यक्ति में कॉलम उपनाम का उपयोग क्यों नहीं कर सकता?

  3. कैसे pg_sleep_until() PostgreSQL में काम करता है

  4. PostgreSQL क्वेरी का निष्पादन समय प्राप्त करें

  5. पोस्टग्रेज में डुप्लिकेट सरणी मानों को समाप्त करें