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

PostgreSQL:सभी टेबल फ़ील्ड की लंबाई पर इंडेक्स बनाएं

टेक्स्ट प्रस्तुति में पंक्ति के आकार को मापने के लिए आप पूरी पंक्ति को टेक्स्ट में डाल सकते हैं, जो अलग-अलग कॉलम को संयोजित करने से कहीं अधिक तेज़ है:

SELECT length(profile::text) FROM profile;

लेकिन इंडेक्स में इस एक्सप्रेशन के साथ 3 (या 4) समस्याएं हैं:

  1. सिंटैक्स शॉर्टहैंड profile::text CREATE INDEX . में स्वीकार नहीं किया गया है , आपको अतिरिक्त कोष्ठक जोड़ने या मानक सिंटैक्स में डिफ़ॉल्ट जोड़ने की आवश्यकता है cast(profile AS text)

  2. अभी भी वही समस्या है जिस पर @jjanes पर पहले ही चर्चा हो चुकी है :केवल IMMUTABLE इंडेक्स एक्सप्रेशन में फ़ंक्शन की अनुमति है और एक पंक्ति प्रकार को text . पर कास्ट करने की अनुमति है इस आवश्यकता को पारित नहीं करता है। आप एक नकली IMMUTABLE बना सकते हैं रैपर फ़ंक्शन, जैसे जेफ़ आउटलाइन किया गया।

  3. एक अंतर्निहित अस्पष्टता है (यह जेफ के उत्तर पर भी लागू होता है!):यदि आपके पास एक स्तंभ नाम है जो तालिका नाम के समान है (जो एक सामान्य मामला है) तो आप पंक्ति प्रकार को CREATE INDEX में संदर्भित नहीं कर सकते हैं। चूंकि पहचानकर्ता हमेशा पहले कॉलम नाम का समाधान करता है।

  4. आपके मूल से मामूली अंतर:यह कॉलम विभाजक, पंक्ति सज्जाकार और संभावित रूप से बच निकलने वाले वर्णों को text में जोड़ता है प्रतिनिधित्व। आपके उपयोग के मामले में ज्यादा मायने नहीं रखना चाहिए।

हालांकि , मैं एक पंक्ति के आकार के लिए कच्चे संकेतक के रूप में एक अधिक क्रांतिकारी विकल्प का सुझाव दूंगा:pg_column_size() . इससे भी छोटा और तेज़ और समस्याओं से बचा जाता है 1 , 3 और 4 :

SELECT pg_column_size(profile) FROM profile;

समस्या 2 हालांकि बनी हुई है:pg_column_size() भी केवल STABLE है . आप एक सरल और सस्ता SQL आवरण फ़ंक्शन बना सकते हैं:

CREATE OR REPLACE FUNCTION pg_column_size(profile)
  RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';

और फिर @jjanes उल्लिखित की तरह आगे बढ़ें। अधिक विवरण:

ध्यान दें कि मैंने पंक्ति प्रकार profile . के साथ फ़ंक्शन बनाया है पैरामीटर के रूप में। Postgres फ़ंक्शन ओवरलोडिंग की अनुमति देता है, यही कारण है कि हम समान फ़ंक्शन नाम का उपयोग कर सकते हैं। अब, जब हम मैचिंग रो टाइप को pg_column_size() . पर फीड करते हैं हमारा कस्टम फ़ंक्शन फ़ंक्शन प्रकार रिज़ॉल्यूशन<के अनुसार अधिक निकटता से मेल खाता है /ए> नियम और पॉलिमॉर्फिक सिस्टम फ़ंक्शन के बजाय चुना जाता है। वैकल्पिक रूप से, एक अलग नाम का उपयोग करें और संभवतः फ़ंक्शन को बहुरूपी भी बनाएं ...

संबंधित:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या आप 8.3 के बाद से PostgreSQL TEMP TABLE के प्रदर्शन में गिरावट देख रहे हैं?

  2. ओडू में कई 2 कई फ़ील्ड जोड़ने के बाद संबंध पहले से मौजूद है

  3. पोस्टग्रेज:त्रुटि:कैश्ड योजना को परिणाम प्रकार नहीं बदलना चाहिए

  4. रेल डेटाबेस, विकास और उत्पादन के लिए एक ही डीबीएमएस का उपयोग क्यों करें?

  5. रेल एसक्यूएल चयन कथन में स्थिरांक पर ध्यान नहीं देता