टेक्स्ट प्रस्तुति में पंक्ति के आकार को मापने के लिए आप पूरी पंक्ति को टेक्स्ट में डाल सकते हैं, जो अलग-अलग कॉलम को संयोजित करने से कहीं अधिक तेज़ है:
SELECT length(profile::text) FROM profile;
लेकिन इंडेक्स में इस एक्सप्रेशन के साथ 3 (या 4) समस्याएं हैं:
-
सिंटैक्स शॉर्टहैंड
profile::text
CREATE INDEX
. में स्वीकार नहीं किया गया है , आपको अतिरिक्त कोष्ठक जोड़ने या मानक सिंटैक्स में डिफ़ॉल्ट जोड़ने की आवश्यकता हैcast(profile AS text)
-
अभी भी वही समस्या है जिस पर @jjanes पर पहले ही चर्चा हो चुकी है :केवल
IMMUTABLE
इंडेक्स एक्सप्रेशन में फ़ंक्शन की अनुमति है और एक पंक्ति प्रकार कोtext
. पर कास्ट करने की अनुमति है इस आवश्यकता को पारित नहीं करता है। आप एक नकलीIMMUTABLE
बना सकते हैं रैपर फ़ंक्शन, जैसे जेफ़ आउटलाइन किया गया। -
एक अंतर्निहित अस्पष्टता है (यह जेफ के उत्तर पर भी लागू होता है!):यदि आपके पास एक स्तंभ नाम है जो तालिका नाम के समान है (जो एक सामान्य मामला है) तो आप पंक्ति प्रकार को
CREATE INDEX
में संदर्भित नहीं कर सकते हैं। चूंकि पहचानकर्ता हमेशा पहले कॉलम नाम का समाधान करता है। -
आपके मूल से मामूली अंतर:यह कॉलम विभाजक, पंक्ति सज्जाकार और संभावित रूप से बच निकलने वाले वर्णों को
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()
. पर फीड करते हैं हमारा कस्टम फ़ंक्शन फ़ंक्शन प्रकार रिज़ॉल्यूशन<के अनुसार अधिक निकटता से मेल खाता है /ए> नियम और पॉलिमॉर्फिक सिस्टम फ़ंक्शन के बजाय चुना जाता है। वैकल्पिक रूप से, एक अलग नाम का उपयोग करें और संभवतः फ़ंक्शन को बहुरूपी भी बनाएं ...
संबंधित: