Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hUWzp-0000d8-1G for pgsql-performance@arkaria.postgresql.org; Sat, 25 May 2019 13:46:01 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1hUWzn-00028b-9p for pgsql-performance@arkaria.postgresql.org; Sat, 25 May 2019 13:45:59 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hUWzm-00026o-U6 for pgsql-performance@lists.postgresql.org; Sat, 25 May 2019 13:45:59 +0000 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hUWzk-0002jh-Mm for pgsql-performance@lists.postgresql.org; Sat, 25 May 2019 13:45:58 +0000 Received: by mail-wr1-x42a.google.com with SMTP id l17so4171925wrm.10 for ; Sat, 25 May 2019 06:45:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=to:from:subject:openpgp:autocrypt:message-id:date:user-agent :mime-version:content-language:content-transfer-encoding; bh=MXU7JadkTm51AXM5Uo808tGYwG7ydpDMXyQeuPmKg5U=; b=mICo+02t807lxZzkYjdvVxmw5xZz68d6HxDen5RIbYc7HDgGkjf+I1QixJZ+A4+DQ1 ASBOr9LIdvBMS9S/CIHByVr0kfVABzigxgrjjJt48X7ZHCb45t+mG6SdHFfw1dLBPpJs vVEmZQM5S3SsVoVmMfkz073d04THQ2FFJb5akketswlAUeYotuFzmh7il+dW14XQP9Rj Vmgau53LnrhDEnmYdqi7kl7KjoI3/CQiZt2Ky8Ybh3nVCZuLO4pQzpzWIEOiWmuJyzRY /rlpfhZECTy5epuT3vEWYpbLnKerH2OHSCshjwQ2jCapxd295Ch3STfZl/ey2rTxVWkT K2AQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:openpgp:autocrypt:message-id :date:user-agent:mime-version:content-language :content-transfer-encoding; bh=MXU7JadkTm51AXM5Uo808tGYwG7ydpDMXyQeuPmKg5U=; b=eMs0P2/g5BFO7H7hLnJ3HMPUR/24Z/V3xoKXQgA8ovgFb320IlXVUaDLH6kEFrCLL9 vsi7LpmPqf50sTJA1lYUiYkGQFw2i2HFKP4sp1jJQa7B+NEx07nLEmGJMHKw0jNbIJAp 1DjDa4Ieu+5895/mkGvvQmRmC7OddyoD+aqeVI5ADpCnCBZtQXoEOq+9ROyacmOnBhux QcMAmPbZ8V3R07XXTYc50r1XX0eFSYk5R3teyFTCwR4NQda3G8jf+x+A+0fb6tjgAysb 5RdnKeU1phUxReFoEAUxTf9j16q99N8kQr9405xAZlsMLfgAn3GKPm23McXY/QxX0Rqr Ff+w== X-Gm-Message-State: APjAAAVX4PH8rKwfBc5gjF8QamzvhBX89TLWc5SCq3wRJWHxn0qYjfhH rJJMxgdkMUxRdscyJb440v7hL/sc X-Google-Smtp-Source: APXvYqwGQuHDigOG0jElFDsSow9HzcS0RaVpAYcqk34sY7PmMmROtOdKSK4I+2Pi7qSq56kuRZFdpQ== X-Received: by 2002:adf:f74f:: with SMTP id z15mr41064009wrp.282.1558791954602; Sat, 25 May 2019 06:45:54 -0700 (PDT) Received: from [192.168.66.78] (pD9582420.dip0.t-ipconnect.de. [217.88.36.32]) by smtp.googlemail.com with ESMTPSA id f2sm6280003wme.12.2019.05.25.06.45.53 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 25 May 2019 06:45:53 -0700 (PDT) To: pgsql-performance@lists.postgresql.org From: Ancoron Luciferis Subject: UUID v1 optimizations... Openpgp: preference=signencrypt Autocrypt: addr=ancoron.luciferis@googlemail.com; prefer-encrypt=mutual; keydata= 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 jG7LftY+nte9Tt8CTQ== Message-ID: <8d5f4b67-d540-8d3d-9979-808b9c1e1ca7@googlemail.com> Date: Sat, 25 May 2019 15:45:53 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk Hi all, Some time ago, I was having trouble with some rather high load OLTP application (in Java, but that doesn't really matter) that was using v1 UUID's for primary keys and after some time, the bloat of certain indexes went quite high. So I investigated the PostgreSQL code to see how it is handling UUID's with respect to storage, sorting, aso. but all I could find was that it basically falls back to the 16-byte. After struggling to find a way to optimize things inside the database, I reverted to introduce a hack into the application by not shuffling the timestamp bytes for the UUID's, which makes it look quite serial in terms of byte order. With that, we were able to reduce bloat by magnitudes and finally VACUUM also was able to reclaim index space. So, my question now is: Would it make sense for you to handle these time-based UUID's differently internally? Specifically un-shuffling the timestamp before they are going to storage? A second question would be whether native support functions could be introduced? Most interesting for me would be: * timestamp * version * variant Here are some numbers from the tests I have run (against a PostgreSQL 10 server): 1. insert 5,000,000 rows 2. delete 2,500,000 rows Index Bloat: idxname | bloat_ratio | bloat_size | real_size ---------------------+-------------+------------+----------- uuid_v1_pkey | 23.6 | 46 MB | 195 MB uuid_serial_pkey | 50.4 | 76 MB | 150 MB Higher ratio for "serial", but still lower total index size. :) Now, the performance of VACUUM is also very interesting here: # vacuum (verbose, analyze, freeze) uuid_serial; INFO: vacuuming "public.uuid_serial" INFO: index "uuid_serial_pkey" now contains 2500001 row versions in 19253 pages DETAIL: 0 index row versions were removed.ce(toast.reltuples, 0) / 4 ) * bs ) as expected_bytes 9624 index pages have been deleted, 9624 are currently reusable. CPU: user: 0.03 s, system: 0.01 s, elapsed: 0.05 s.t.oid INFO: "uuid_serial": found 0 removable, 2500001 nonremovable row versions in 13515 out of 27028 pages DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 270712 There were 94 unused item pointers. Skipped 0 pages due to buffer pins, 13513 frozen pages. 0 pages are entirely empty.be reused CPU: user: 0.37 s, system: 0.16 s, elapsed: 2.83 s. INFO: analyzing "public.uuid_serial"e compressed INFO: "uuid_serial": scanned 27028 of 27028 pages, containing 2500001 live rows and 0 dead rows; 30000 rows in sample, 2500001 estimated total rows VACUUM schemaname, tablename, can_estimate, Time: 3969.812 ms (00:03.970) # vacuum (verbose, analyze, freeze) uuid_v1; INFO: vacuuming "public.uuid_v1" INFO: scanned index "uuid_v1_pkey" to remove 2499999 row versions DETAIL: CPU: user: 1.95 s, system: 0.13 s, elapsed: 5.09 s INFO: "uuid_v1": removed 2499999 row versions in 27028 pages DETAIL: CPU: user: 0.22 s, system: 0.26 s, elapsed: 3.93 s INFO: index "uuid_v1_pkey" now contains 2500001 row versions in 24991 pages DETAIL: 2499999 index row versions were removed. 12111 index pages have been deleted, 0 are currently reusable. CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s. INFO: "uuid_v1": found 1791266 removable, 2500001 nonremovable row versions in 27028 out of 27028 pages DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 270716 There were 0 unused item pointers. Skipped 0 pages due to buffer pins, 0 frozen pages. 0 pages are entirely empty. CPU: user: 2.90 s, system: 0.71 s, elapsed: 14.54 s. INFO: analyzing "public.uuid_v1" INFO: "uuid_v1": scanned 27028 of 27028 pages, containing 2500001 live rows and 0 dead rows; 30000 rows in sample, 2500001 estimated total rows VACUUM Time: 15702.803 ms (00:15.703) ...almost 5x faster! Now insert another 20 million: COPY uuid_serial FROM '...' WITH ( FORMAT text ); COPY 20000000 Time: 76249.142 ms (01:16.249) COPY uuid_v1 FROM '...' WITH ( FORMAT text ); COPY 20000000 Time: 804291.611 ms (13:24.292) ...more than 10x faster! ...and the resulting bloat (no VACUUM in between): idxname | bloat_ratio | bloat_size | real_size ---------------------+-------------+------------+----------- uuid_v1_pkey | 30.5 | 295 MB | 966 MB uuid_serial_pkey | 0.9 | 6056 kB | 677 MB ...still 30% savings in space. Cheers, Ancoron