BCD instrukcie sa na pocitanie meny v terajsej dobe uz moc nepouzivaju, long mode x86-64 ich uz nepodporuje.
Pouziva sa 64 bit integer s umelo vytvorenou desatinnou ciarkou, rozsah -92 233 720 368 547 758.08 az +92 233 720 368 547 758.07, co pre vecsinu aplikacii postacuje.
13. 4. 2023, 04:36 editováno autorem komentáře
Postgresový Numeric funguje na podobném principu jako BCD https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/numeric.c
Pro mne, když jsem to viděl poprvé, hodně zajímavé bylo použití číslic 0..9999 místo obvyklých 0..9.
Nooo, 0..9 je obvykle pri pocitani na papieri. Tych 0..9999 umoznuje pouzit 16bit aritmetiku. IMHO, to preco je to vlastne ulozene ako pole 0..9999 hodnot je dane hlavne tym ako funguje prevod numeric na text, ak by to bolo ulozene ako jeden dlhy integer, tak by sa musela vzdy konvertovat cela frakna cast a stripnut na pocet desatinnych miest uvedeny vo formate...
V podstate je ale postgres mozne skopilovat tak aby pre ulozenie numeric pouzival zaklad 10 miesto 10000, riadky 75 a 95 linkovaneho zdrojaku, akurat je treba dat pozor na export povodnych dat, kde bude treba pouzit inserty miesto obvykleho copy.
13. 4. 2023, 14:45 editováno autorem komentáře
Postgres by default používá textový protokol (čísla se přenášejí jako text) pro vstup (INSERT, COPY FROM) i pro výstup (SELECT, COPY TO). Komentář ohledně změny NBASE zmiňuje problémy s binárním protokolem. Ten se zase může použít jak pro vstup, tak pro výstup. Ohledně vstupu může být binární protokol použitý i v parametrizovaném INSERTu (při volání API se nastavuje flag, jestli se parametry přenášejí binárně nebo nebo ne). Příkaz COPY FROM BINARY očekává binární protokol.
Opět, co může být trochu překvapující nebo matoucí, binární protokol nemusí nutně používat nativní formát. Je to navržené tak, aby byl binární protokol platformě nezávislý (např. interně používá pg jinou reprezentaci int64 na 32 bitech a na 64bitech).
S tím jsem ve svých začátcích s pg dost zápasil - a nechápal jsem, proč se víc nepoužívají nativní Cčkové reprezentace datových typů.
Jinak omlouvám se za offtopic :-)
Hodně záleží na datech, které máte. Pokud máte jenom čísla, a k tomu kratší stringy (to, co se označuje jako socio ekonomická data), tak tam zrychlení by příliš velké být nemělo. U dlouhých řetězců, dlouhých bytea nebo geodat si to zrychlení dovedu představit. Například u bytea vám binární protokol ušetří kódování, dekódování do hexakódu (CPU, a výsledný objem dat je poloviční).