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

वर्बिट को इंट में डालने का दूसरा तरीका? और बड़ा?

मैंने कुछ प्रकारों का परीक्षण किया (bigint . के लिए) केवल) अंतर्निहित कार्यक्षमता के साथ और यह संस्करण के साथ OVERLAY() निकला सबसे तेज़ Postgres 11 पर मेरे स्थानीय परीक्षणों में:

CREATE OR REPLACE FUNCTION varbit2bigint2(b varbit)
  RETURNS bigint AS
$func$
SELECT OVERLAY(bit(64) '0' PLACING b FROM 65 - bit_length(b))::bigint
$func$  LANGUAGE SQL IMMUTABLE;

अन्य उम्मीदवार:

खाली बिटस्ट्रिंग के विभिन्न रूपांतरणों पर ध्यान दें ('' ) से 0 बनाम NULL . अपनी आवश्यकताओं के अनुकूल!

आपका कार्य:

CREATE OR REPLACE FUNCTION varbit2bigint1(b varbit)
  RETURNS bigint AS
$func$
  SELECT CASE bit_length($1)
   WHEN  1 THEN $1::bit(1)::bigint
   WHEN  2 THEN $1::bit(2)::bigint
   WHEN  3 THEN $1::bit(3)::bigint
   WHEN  4 THEN $1::bit(4)::bigint
   WHEN  5 THEN $1::bit(5)::bigint
   WHEN  6 THEN $1::bit(6)::bigint
   WHEN  7 THEN $1::bit(7)::bigint
   WHEN  8 THEN $1::bit(8)::bigint
   WHEN  9 THEN $1::bit(9)::bigint
   WHEN 10 THEN $1::bit(10)::bigint
   WHEN 11 THEN $1::bit(11)::bigint
   WHEN 12 THEN $1::bit(12)::bigint
   WHEN 13 THEN $1::bit(13)::bigint
   WHEN 14 THEN $1::bit(14)::bigint
   WHEN 15 THEN $1::bit(15)::bigint
   WHEN 16 THEN $1::bit(16)::bigint
   WHEN 17 THEN $1::bit(17)::bigint
   WHEN 18 THEN $1::bit(18)::bigint
   WHEN 19 THEN $1::bit(19)::bigint
   WHEN 20 THEN $1::bit(20)::bigint
   WHEN 21 THEN $1::bit(21)::bigint
   WHEN 22 THEN $1::bit(22)::bigint
   WHEN 23 THEN $1::bit(23)::bigint
   WHEN 24 THEN $1::bit(24)::bigint
   WHEN 25 THEN $1::bit(25)::bigint
   WHEN 26 THEN $1::bit(26)::bigint
   WHEN 27 THEN $1::bit(27)::bigint
   WHEN 28 THEN $1::bit(28)::bigint
   WHEN 29 THEN $1::bit(29)::bigint
   WHEN 30 THEN $1::bit(30)::bigint
   WHEN 31 THEN $1::bit(31)::bigint
   WHEN 32 THEN $1::bit(32)::bigint
   WHEN 33 THEN $1::bit(33)::bigint
   WHEN 34 THEN $1::bit(34)::bigint
   WHEN 35 THEN $1::bit(35)::bigint
   WHEN 36 THEN $1::bit(36)::bigint
   WHEN 37 THEN $1::bit(37)::bigint
   WHEN 38 THEN $1::bit(38)::bigint
   WHEN 39 THEN $1::bit(39)::bigint
   WHEN 40 THEN $1::bit(40)::bigint
   WHEN 41 THEN $1::bit(41)::bigint
   WHEN 42 THEN $1::bit(42)::bigint
   WHEN 43 THEN $1::bit(43)::bigint
   WHEN 44 THEN $1::bit(44)::bigint
   WHEN 45 THEN $1::bit(45)::bigint
   WHEN 46 THEN $1::bit(46)::bigint
   WHEN 47 THEN $1::bit(47)::bigint
   WHEN 48 THEN $1::bit(48)::bigint
   WHEN 49 THEN $1::bit(49)::bigint
   WHEN 50 THEN $1::bit(50)::bigint
   WHEN 51 THEN $1::bit(51)::bigint
   WHEN 52 THEN $1::bit(52)::bigint
   WHEN 53 THEN $1::bit(53)::bigint
   WHEN 54 THEN $1::bit(54)::bigint
   WHEN 55 THEN $1::bit(55)::bigint
   WHEN 56 THEN $1::bit(56)::bigint
   WHEN 57 THEN $1::bit(57)::bigint
   WHEN 58 THEN $1::bit(58)::bigint
   WHEN 59 THEN $1::bit(59)::bigint
   WHEN 60 THEN $1::bit(60)::bigint
   WHEN 61 THEN $1::bit(61)::bigint
   WHEN 62 THEN $1::bit(62)::bigint
   WHEN 63 THEN $1::bit(63)::bigint
   WHEN 64 THEN $1::bit(64)::bigint
   ELSE NULL::bigint
  END
$func$  LANGUAGE SQL IMMUTABLE;  -- no STRICT modifier

टेक्स्ट प्रतिनिधित्व को '0' के साथ बाएँ-पैडिंग करना:

CREATE OR REPLACE FUNCTION pg_temp.varbit2bigint3(b varbit)
  RETURNS bigint AS
$func$
SELECT lpad(b::text, 64, '0')::bit(64)::bigint
$func$  LANGUAGE SQL IMMUTABLE;

कलाकारों से पहले बिट-शिफ्टिंग:

CREATE OR REPLACE FUNCTION varbit2bigint4(b varbit)
  RETURNS bigint AS
$func$
SELECT (bit(64) '0' || b << bit_length(b))::bit(64)::bigint
$func$  LANGUAGE SQL IMMUTABLE;

db<>fiddle यहां

संबंधित:

आपकी प्रतिक्रिया

आप एक STRICT दिखाते हैं bigint . के साथ संशोधक प्रश्न में फ़ंक्शन का प्रकार (सुनिश्चित नहीं है कि यह integer . से भिन्न क्यों है वेरिएंट)। यदि यह आपके द्वारा वास्तव में परीक्षण किए गए फ़ंक्शन का प्रतिनिधित्व करता है, तो मुझे उम्मीद है कि देखा गया अधिकांश प्रदर्शन अंतर उस जोड़े गए STRICT के कारण है। फ़ंक्शन इनलाइनिंग preventing को रोकने वाला संशोधक . पोस्टग्रेज विकी को उद्धृत करना:

ऐसा लगता है कि आपके कार्य को बुरी तरह से नुकसान पहुंचा है - जबकि मेरा विजेता अप्रभावित लगता है, और अन्य दो प्रकार भी ~ 10% तेज हैं। STRICT with के साथ एक ही पहेली कार्य:

db<>fiddle यहां

संबंधित:

मेरा सुझाव है कि आप STRICT . के साथ और बिना पुन:परीक्षण करें संशोधक अपने लिए देखें।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql में एक चर का मान प्रिंट करना

  2. मुझे SQL में सभी गतिविधियों को एक आईडी पर असाइन करने की आवश्यकता है, लेकिन वर्तमान में प्रत्येक गतिविधि में तीन आईडी हैं

  3. PostgreSQL जहां सभी सरणी में

  4. Heroku . पर डेटाबेस को देख रहे हैं

  5. जावा तिथियों के आधार पर पोस्टग्रेज में टाइमस्टैम्प सहेजा जा रहा है