Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rbNra-00FBQT-QF for pgsql-hackers@arkaria.postgresql.org; Sat, 17 Feb 2024 16:48:31 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rbNrZ-007AYh-Bj for pgsql-hackers@arkaria.postgresql.org; Sat, 17 Feb 2024 16:48:29 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rbNrY-007AYZ-UB for pgsql-hackers@lists.postgresql.org; Sat, 17 Feb 2024 16:48:29 +0000 Received: from mail-wm1-x333.google.com ([2a00:1450:4864:20::333]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rbNrW-007h2d-BT for pgsql-hackers@lists.postgresql.org; Sat, 17 Feb 2024 16:48:28 +0000 Received: by mail-wm1-x333.google.com with SMTP id 5b1f17b1804b1-4125e435b38so2760595e9.0 for ; Sat, 17 Feb 2024 08:48:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cybertec-at.20230601.gappssmtp.com; s=20230601; t=1708188504; x=1708793304; darn=lists.postgresql.org; h=mime-version:user-agent:autocrypt:date:to:from:subject:message-id :from:to:cc:subject:date:message-id:reply-to; bh=MQSHXPPdZGR2GfI4nFerSnZ2UvZru12wabGZIukfcLU=; b=Oiga/TtDigo6VWScbPavY94rQuJMFpkBR9RPMDKgD711VSUDFtYXVaJprBfyXEjbtM 8nLjBMQSvWHYYPgRi+Xr/OWYjJ5fBozqgpz0VMz5thbZzHeNALse/FWnv3wMqoqBXcTv x5tiOq4dDltovQPBEihGP8rh95/7b/pOLezegUo+Gi4ci1jxaCXG+cnLlsQOQShdDslH PClBdsQqp2YjNF7VpbM0kBgmEoH1JGKdqFfcfY6/N1GbT4bOA+IRD/a84tgchAy+8wtj S50PatLY9v58RKZjCXNmwYUpjcDUtZMOF2IR0DcKoN+s3W0L7bOES0/b1gmnQrGWPqd6 WTJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708188504; x=1708793304; h=mime-version:user-agent:autocrypt:date:to:from:subject:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=MQSHXPPdZGR2GfI4nFerSnZ2UvZru12wabGZIukfcLU=; b=ujcqMH2a6RfwOgbQlWgK3/qAHewDEQLnrYnGWhjd2nrOCGyqDmAcQP7KcbZ6egNJpn kpX7ZLQmSTxXUo64gNX042k2HoSPHVWDbNy1knNrmVSIQGkpfgQhXBFfELD6/XJmba3S 9Gts1HwUvl1tSBqLDZbdktF8oS1f5Kp6LOKC7qW6yb/FimorqnE/nrmB9gk19hzP5fYq dYBxD979Gdaj/yOcnjfn0WnBXMzwjZlJjRDDcjQm8MhaBl1wpLft7RbhaTa5gUqGYztS +mrzkv4wxd6d2zjz4IVt4UaEWBh8ObB60DOL2fidtaoeZaHXpkcwdH5w1tVF3XctmFmo Orkw== X-Gm-Message-State: AOJu0YyHiriA3DbO3RZV0B96zd2qMT3kFpzQSYE4N4ZKvhn9AYfU5F6C ku7oAGQsxcckBRgDNAC16j2LvGERfzGizY5InmBj525IMiWQi6pdR8WjQaxmgFaFHCRVmi7JAH8 Q X-Google-Smtp-Source: AGHT+IFz7viq/wn8owoHO3Wg1d/5/ia89McksXUbmjliitc6Abwd8N2DYC/tuZEFWK/YW9CDBJj68A== X-Received: by 2002:a05:600c:35d3:b0:412:392e:6f0f with SMTP id r19-20020a05600c35d300b00412392e6f0fmr4196604wmq.5.1708188504004; Sat, 17 Feb 2024 08:48:24 -0800 (PST) Received: from localhost.localdomain ([2001:871:260:ea52:33c9:1138:43fe:7a0c]) by smtp.gmail.com with ESMTPSA id q17-20020a05600c46d100b0041249ea88b9sm4989349wmo.16.2024.02.17.08.48.23 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 17 Feb 2024 08:48:23 -0800 (PST) Message-ID: <679d5455cbbb0af667ccb753da51a475bae1eaed.camel@cybertec.at> Subject: Speeding up COPY TO for uuids and arrays From: Laurenz Albe To: pgsql-hackers@lists.postgresql.org Date: Sat, 17 Feb 2024 17:48:23 +0100 Autocrypt: addr=laurenz.albe@cybertec.at; prefer-encrypt=mutual; keydata=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 +AnW5l0HsQcY9ntFL/zEBOaonjdJf Content-Type: multipart/mixed; boundary="=-c/CtRiqaE4tobEW30GV0" User-Agent: Evolution 3.50.3 (3.50.3-1.fc39) MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-c/CtRiqaE4tobEW30GV0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable While analyzing a customer's performance problem, I noticed that the performance of pg_dump for large arrays is terrible. As a test case, I created a table with 10000 rows, each of which had an array of 10000 uuids. The table resided in shared buffers. The following took 24.5 seconds: COPY mytab TO '/dev/null'; Most of the time was spent in array_out and uuid_out. I tried binary copy, which took 4.4 seconds: COPY mytab TO '/dev/null' (FORMAT 'binary'); Here, a lot of time was spent in pq_begintypsend. So I looked for low-hanging fruit, and the result is the attached patch series. - Patch 0001 speeds up pq_begintypsend with a custom macro. That brought the binary copy down to 3.7 seconds, which is a speed gain of 15%. - Patch 0001 speeds up uuid_out by avoiding the overhead of a Stringinfo. This brings text mode COPY to 19.4 seconds, which is speed gain of 21%. - Patch 0003 speeds up array_out a bit by avoiding some zero byte writes. The measured speed gain is under 2%. Yours, Laurenz Albe --=-c/CtRiqaE4tobEW30GV0 Content-Disposition: attachment; filename="v1-0001-Speed-up-binary-COPY-TO.patch" Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name="v1-0001-Speed-up-binary-COPY-TO.patch"; charset="UTF-8" RnJvbSBlZWY4ZmI1ZDVhNTY3YTE3MzFkOGViNmFlMjRmMzJhOWEwODc5MDI4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMYXVyZW56IEFsYmUgPGxhdXJlbnouYWxiZUBjeWJlcnRlYy5h dD4KRGF0ZTogU2F0LCAxNyBGZWIgMjAyNCAxNzoxMjo0MCArMDEwMApTdWJqZWN0OiBbUEFUQ0gg djEgMS8zXSBTcGVlZCB1cCBiaW5hcnkgQ09QWSBUTwoKUGVyZm9ybWFuY2UgYW5hbHlzaXMgc2hv d3MgdGhhdCBhIGxvdCBvZiB0aW1lIGlzIHNwZW50CmluIHBxX2JlZ2ludHlwc2VuZCwgc28gc3Bl ZWRpbmcgdGhhdCB1cCB3aWxsIGJvb3N0IHRoZQpwZXJmb3JtYW5jZSBvZiBiaW5hcnkgQ09QWSBU TyBjb25zaWRlcmFibHkuCgpJbnZlbnQgYSBuZXcgbWFjcm8gdG8gaW5pdGlhbGl6ZSBhIFN0cmlu Z0luZm8gYW5kIGZpbGwKdGhlIGZpcnN0IGZvdXIgYnl0ZXMgd2l0aCB6ZXJvcy4gIFRoaXMgbWFj cm8gaXMgb25seSB1c2VkCmluIHBxX2JlZ2ludHlwc2VuZCwgYnV0IHdlIGhhZCBiZXR0ZXIga2Vl cCBpbXBsZW1lbnRhdGlvbgpkZXRhaWxzIG9mIFN0cmluZ0luZm8gaW4gc3RyaW5naW5mby5oLgot LS0KIHNyYy9iYWNrZW5kL2xpYnBxL3BxZm9ybWF0LmMgfCAgNiArLS0tLS0KIHNyYy9pbmNsdWRl L2xpYi9zdHJpbmdpbmZvLmggfCAxNCArKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCAx NSBpbnNlcnRpb25zKCspLCA1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2xpYnBxL3BxZm9ybWF0LmMgYi9zcmMvYmFja2VuZC9saWJwcS9wcWZvcm1hdC5jCmluZGV4IGE2 OTdjY2ZiYmYuLjI1NWRkNGU1ZTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2xpYnBxL3BxZm9y bWF0LmMKKysrIGIvc3JjL2JhY2tlbmQvbGlicHEvcHFmb3JtYXQuYwpAQCAtMzI4LDEyICszMjgs OCBAQCBwcV9lbmRtZXNzYWdlX3JldXNlKFN0cmluZ0luZm8gYnVmKQogdm9pZAogcHFfYmVnaW50 eXBzZW5kKFN0cmluZ0luZm8gYnVmKQogewotCWluaXRTdHJpbmdJbmZvKGJ1Zik7CiAJLyogUmVz ZXJ2ZSBmb3VyIGJ5dGVzIGZvciB0aGUgYnl0ZWEgbGVuZ3RoIHdvcmQgKi8KLQlhcHBlbmRTdHJp bmdJbmZvQ2hhck1hY3JvKGJ1ZiwgJ1wwJyk7Ci0JYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybyhi dWYsICdcMCcpOwotCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oYnVmLCAnXDAnKTsKLQlhcHBl bmRTdHJpbmdJbmZvQ2hhck1hY3JvKGJ1ZiwgJ1wwJyk7CisJaW5pdFN0cmluZ0luZm9XaXRoNFpl cm9zKGJ1Zik7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9saWIvc3RyaW5naW5mby5oIGIvc3JjL2luY2x1ZGUvbGliL3N0 cmluZ2luZm8uaAppbmRleCAyY2Q2MzZiMDFjLi5kYjM4YjZkM2Y3IDEwMDY0NAotLS0gYS9zcmMv aW5jbHVkZS9saWIvc3RyaW5naW5mby5oCisrKyBiL3NyYy9pbmNsdWRlL2xpYi9zdHJpbmdpbmZv LmgKQEAgLTExMiw2ICsxMTIsMjAgQEAgZXh0ZXJuIFN0cmluZ0luZm8gbWFrZVN0cmluZ0luZm8o dm9pZCk7CiAgKi8KIGV4dGVybiB2b2lkIGluaXRTdHJpbmdJbmZvKFN0cmluZ0luZm8gc3RyKTsK IAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGluaXRTdHJpbmdJbmZvV2l0aDRaZXJv cworICogQXMgYWJvdmUsIGJ1dCBhcHBlbmQgZm91ciB6ZXJvIGJ5dGVzLgorICovCisjZGVmaW5l IGluaXRTdHJpbmdJbmZvV2l0aDRaZXJvcyhzdHIpIFwKKwl7IFwKKwkJaW5pdFN0cmluZ0luZm8o c3RyKTsgXAorCQkoc3RyKS0+ZGF0YVswXSA9ICdcMCc7IFwKKwkJKHN0ciktPmRhdGFbMV0gPSAn XDAnOyBcCisJCShzdHIpLT5kYXRhWzJdID0gJ1wwJzsgXAorCQkoc3RyKS0+ZGF0YVszXSA9ICdc MCc7IFwKKwkJKHN0ciktPmxlbiA9IDQ7IFwKKwl9CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCiAgKiBpbml0UmVhZE9ubHlTdHJpbmdJbmZvCiAgKiBJbml0aWFsaXplIGEgU3RyaW5nSW5m b0RhdGEgc3RydWN0IGZyb20gYW4gZXhpc3Rpbmcgc3RyaW5nIHdpdGhvdXQgY29weWluZwotLSAK Mi40My4yCgo= --=-c/CtRiqaE4tobEW30GV0 Content-Disposition: attachment; filename="v1-0002-Speed-up-uuid_out.patch" Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name="v1-0002-Speed-up-uuid_out.patch"; charset="UTF-8" RnJvbSBkZTg3ZDI0OWUzZjU1YzM4MDYyZTU2MzgyMWFmOWZhMzJkMTVlMzQxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMYXVyZW56IEFsYmUgPGxhdXJlbnouYWxiZUBjeWJlcnRlYy5h dD4KRGF0ZTogU2F0LCAxNyBGZWIgMjAyNCAxNzoyMzozOSArMDEwMApTdWJqZWN0OiBbUEFUQ0gg djEgMi8zXSBTcGVlZCB1cCB1dWlkX291dAoKU2luY2UgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBy ZXByZXNlbnRhdGlvbiBvZiBhbiB1dWlkIGlzCmZpeGVkLCB0aGVyZSBpcyBubyBiZW5lZml0IGlu IHVzaW5nIGEgU3RyaW5nSW5mby4KQXZvaWRpbmcgdGhlIG92ZXJoZWFkIG1ha2VzIHRoZSBmdW5j dGlvbiBzdWJzdGFudGlhbGx5IGZhc3Rlci4KLS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQvdXVp ZC5jIHwgMTQgKysrKysrKystLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyks IDYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3V1aWQu YyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC91dWlkLmMKaW5kZXggNzNkZmQ3MTFjNy4uYjQ4YmJm MDFlMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3V1aWQuYworKysgYi9zcmMv YmFja2VuZC91dGlscy9hZHQvdXVpZC5jCkBAIC01MywxMCArNTMsMTEgQEAgdXVpZF9vdXQoUEdf RlVOQ1RJT05fQVJHUykKIHsKIAlwZ191dWlkX3QgICp1dWlkID0gUEdfR0VUQVJHX1VVSURfUCgw KTsKIAlzdGF0aWMgY29uc3QgY2hhciBoZXhfY2hhcnNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsK LQlTdHJpbmdJbmZvRGF0YSBidWY7CisJY2hhcgkgICAqYnVmLCAqcDsKIAlpbnQJCQlpOwogCi0J aW5pdFN0cmluZ0luZm8oJmJ1Zik7CisJYnVmID0gcGFsbG9jKDIgKiBVVUlEX0xFTiArIDUpOwor CXAgPSBidWY7CiAJZm9yIChpID0gMDsgaSA8IFVVSURfTEVOOyBpKyspCiAJewogCQlpbnQJCQlo aTsKQEAgLTY4LDE2ICs2OSwxNyBAQCB1dWlkX291dChQR19GVU5DVElPTl9BUkdTKQogCQkgKiAo Ii0iKS4gVGhlcmVmb3JlLCBhZGQgdGhlIGh5cGhlbnMgYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNl cyBoZXJlLgogCQkgKi8KIAkJaWYgKGkgPT0gNCB8fCBpID09IDYgfHwgaSA9PSA4IHx8IGkgPT0g MTApCi0JCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmYnVmLCAnLScpOworCQkJKnArKyA9ICctJzsK IAogCQloaSA9IHV1aWQtPmRhdGFbaV0gPj4gNDsKIAkJbG8gPSB1dWlkLT5kYXRhW2ldICYgMHgw RjsKIAotCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmYnVmLCBoZXhfY2hhcnNbaGldKTsKLQkJYXBw ZW5kU3RyaW5nSW5mb0NoYXIoJmJ1ZiwgaGV4X2NoYXJzW2xvXSk7CisJCSpwKysgPSBoZXhfY2hh cnNbaGldOworCQkqcCsrID0gaGV4X2NoYXJzW2xvXTsKIAl9CisJKnAgPSAnXDAnOwogCi0JUEdf UkVUVVJOX0NTVFJJTkcoYnVmLmRhdGEpOworCVBHX1JFVFVSTl9DU1RSSU5HKGJ1Zik7CiB9CiAK IC8qCi0tIAoyLjQzLjIKCg== --=-c/CtRiqaE4tobEW30GV0 Content-Disposition: attachment; filename="v1-0003-Small-speedup-for-array_out.patch" Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name="v1-0003-Small-speedup-for-array_out.patch"; charset="UTF-8" RnJvbSBlODM0NmVhODg3ODVhNzYzZDJiZDNmOTk4MDBhZTkyOGI3NDY5ZjY0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMYXVyZW56IEFsYmUgPGxhdXJlbnouYWxiZUBjeWJlcnRlYy5h dD4KRGF0ZTogU2F0LCAxNyBGZWIgMjAyNCAxNzoyNDoxOSArMDEwMApTdWJqZWN0OiBbUEFUQ0gg djEgMy8zXSBTbWFsbCBzcGVlZHVwIGZvciBhcnJheV9vdXQKCkF2b2lkIHdyaXRpbmcgemVybyBi eXRlcyB3aGVyZSBpdCBpcyBub3QgbmVjZXNzYXJ5LgpUaGlzIG9mZmVycyBvbmx5IGEgc21hbGws IGJ1dCBtZWFzdXJhYmxlIHNwZWVkIGdhaW4KZm9yIGxhcmdlciBhcnJheXMuCi0tLQogc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L2FycmF5ZnVuY3MuYyB8IDkgKysrKystLS0tCiAxIGZpbGUgY2hhbmdl ZCwgNSBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC9hcnJheWZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvYXJyYXlm dW5jcy5jCmluZGV4IGYzZmVlNTRlMzcuLjMwNmM1MDYyZjcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC9hcnJheWZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2Fy cmF5ZnVuY3MuYwpAQCAtMTIwMCw3ICsxMjAwLDcgQEAgYXJyYXlfb3V0KFBHX0ZVTkNUSU9OX0FS R1MpCiAJcCA9IHJldHZhbDsKIAogI2RlZmluZSBBUFBFTkRTVFIoc3RyKQkoc3RyY3B5KHAsIChz dHIpKSwgcCArPSBzdHJsZW4ocCkpCi0jZGVmaW5lIEFQUEVORENIQVIoY2gpCSgqcCsrID0gKGNo KSwgKnAgPSAnXDAnKQorI2RlZmluZSBBUFBFTkRDSEFSKGNoKQkoKnArKyA9IChjaCkpCiAKIAlp ZiAobmVlZGRpbXMpCiAJCUFQUEVORFNUUihkaW1zX3N0cik7CkBAIC0xMjIyLDEwICsxMjIyLDkg QEAgYXJyYXlfb3V0KFBHX0ZVTkNUSU9OX0FSR1MpCiAJCQkJY2hhcgkJY2ggPSAqdG1wOwogCiAJ CQkJaWYgKGNoID09ICciJyB8fCBjaCA9PSAnXFwnKQotCQkJCQkqcCsrID0gJ1xcJzsKLQkJCQkq cCsrID0gY2g7CisJCQkJCUFQUEVORENIQVIoJ1xcJyk7CisJCQkJQVBQRU5EQ0hBUihjaCk7CiAJ CQl9Ci0JCQkqcCA9ICdcMCc7CiAJCQlBUFBFTkRDSEFSKCciJyk7CiAJCX0KIAkJZWxzZQpAQCAt MTI0OCw2ICsxMjQ3LDggQEAgYXJyYXlfb3V0KFBHX0ZVTkNUSU9OX0FSR1MpCiAJCWogPSBpOwog CX0gd2hpbGUgKGogIT0gLTEpOwogCisJKnAgPSAnXDAnOworCiAjdW5kZWYgQVBQRU5EU1RSCiAj dW5kZWYgQVBQRU5EQ0hBUgogCi0tIAoyLjQzLjIKCg== --=-c/CtRiqaE4tobEW30GV0--