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 1t8UP1-004Wzi-Kt for pgsql-bugs@arkaria.postgresql.org; Wed, 06 Nov 2024 01:00:07 +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 1t8UOy-002Ij7-14 for pgsql-bugs@arkaria.postgresql.org; Wed, 06 Nov 2024 01:00:04 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1t8UOx-002Iit-KA for pgsql-bugs@lists.postgresql.org; Wed, 06 Nov 2024 01:00:04 +0000 Received: from mail-pj1-x102b.google.com ([2607:f8b0:4864:20::102b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1t8UOu-000OBx-7y for pgsql-bugs@postgresql.org; Wed, 06 Nov 2024 01:00:02 +0000 Received: by mail-pj1-x102b.google.com with SMTP id 98e67ed59e1d1-2e2ed2230d8so4677567a91.0 for ; Tue, 05 Nov 2024 17:00:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=j-davis-com.20230601.gappssmtp.com; s=20230601; t=1730854799; x=1731459599; darn=postgresql.org; h=mime-version:user-agent:date:to:from:subject:message-id:from:to:cc :subject:date:message-id:reply-to; bh=4S7a6w5wDQhPpE68WdjLRzTP5OTwODPdNYc3TK+d+24=; b=ZdWu9/Rw7rro2Znu2MCtmaKE2UH7TmGJt8RKQaZQvdHhLgFTEk7fvIghCAYAnbbhw/ nGlbs0VKfgVt0xA++tO1VeBiltzyRofi//N0w9Jn51rEmyti0Tn+4VbMDM7s6DnCxgA4 JBJcfSil35bq6F3ka4jeT4VeT3GkbF/pS7+HHPqe8p2pYnQ1F0BdhelKBWBq3ahHbn7K oARB+Nj7Y4dx34Fnv5hKCdZk2AlQNefg3gLuDsVSMYtE7w98I9k8SgDN4uA1OK0N2CBU GdeXbGT+tcCGjL2KQUhSutANNyaRCvuwRw83HNu4ksH1YFhuePWLI2Ep9BO/vmj30G2j ggzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730854799; x=1731459599; h=mime-version:user-agent:date:to:from:subject:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4S7a6w5wDQhPpE68WdjLRzTP5OTwODPdNYc3TK+d+24=; b=nK3oNku7zNFlPI1dXnU4iCjlAcJ6hmtS5hh/L9eaCmnlB2jiEtqBIDa/63Ili56HEU 0pv76hoLmtIzupdxyq6cMjBmuvnGdlCyU25avFORVCj3cldZf38SYm+j3dfwgCgEaL4K xJTZuvI9ZyzDeFmmhSDNWIIraEitU5M2mk8AATjxoKsIwL3pZZLUbt8kMEkVdltAAUaM Go5chgoQ5qJHoPbHJyW9928PbbU+cUoRy4oOZ3uvNrwSW3Kik3YVFPG5N19fVR4E0nb+ XH0GX2QdZywS8HawM4s9CSwyjpVOF8r/NKfB0pzoNeNR/2ZtdSuUg4QSzAR41ClJhvG2 MU8w== X-Gm-Message-State: AOJu0YzxNp/k9ceBkUIlWt3fUdpG0JzsIvLe3kbeL9ngFHaK6U/yDjMu 5QUTdytPpOtcukxBsreR+fqdZtYOMEvwnpInaJIohp0tOjZnK/oddsobTIwrGMqQw9un0MkV8PM = X-Google-Smtp-Source: AGHT+IEMeDCvFBJGcd5Zb0cUKqqPnbUCimSJQTp4JKBpLR12dDzU/2VU72IK9+/S1hlPklBSg4J6+Q== X-Received: by 2002:a17:90b:38c3:b0:2e2:e937:7141 with SMTP id 98e67ed59e1d1-2e94c2e4777mr27019336a91.20.1730854798713; Tue, 05 Nov 2024 16:59:58 -0800 (PST) Received: from jeff-laptop.lan (c-76-102-242-158.hsd1.ca.comcast.net. [76.102.242.158]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2e99a57f2d6sm179724a91.23.2024.11.05.16.59.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Nov 2024 16:59:58 -0800 (PST) Message-ID: Subject: HashAgg degenerate case From: Jeff Davis To: pgsql-bugs@postgresql.org Date: Tue, 05 Nov 2024 16:59:56 -0800 Content-Type: multipart/mixed; boundary="=-YkGXPjRUS9ylOtLVVDZk" User-Agent: Evolution 3.44.4-0ubuntu2 MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-YkGXPjRUS9ylOtLVVDZk Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable HashAgg tracks the hash table bucket array (only TupleHashEntryData) memory differently than the overall hash table (including the firstTuple) memory. It can run into a degenerate case when the bucket array grows larger than the allotted memory for the overall hash table. That, by itself, shouldn't be a major problem because it would just spill any new groups and then start over in the next batch. However, ResetTupleHashTable() calls tuplehash_reset(), and that preserves the bucket array (just clearing it). That means that the next time around it's already over the limit, and degenerates to holding a single tuple. Unfortunately I don't have a small reproducible case yet. I believe it would need to be a case where the bucket array is more than half of the memory limit, and then the hash table needs to grow again (doubling). The actual case involves parallelism, so maybe that throws off the estimates in an interesting way. Fixing it seems fairly easy though: we just need to completely destroy the hash table each time and recreate it. Something close to the attached patch (rough). We might also want to make the degenerate case less painful -- should we raise the minimum number of groups per batch? One possible problem would be around groups where the state is large, like ARRAY_AGG(), but we could have different limits. Regards, Jeff Davis --=-YkGXPjRUS9ylOtLVVDZk Content-Disposition: attachment; filename*0=v1-0001-HashAgg-completely-rebuild-hash-tables-each-itera.pat; filename*1=ch Content-Type: text/x-patch; name="v1-0001-HashAgg-completely-rebuild-hash-tables-each-itera.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA3NzU3NTBmZDU5ZWY2ZjYyMTRkNDFiMTg3YzNmMWU3YjIzOTYxNTIwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBU dWUsIDUgTm92IDIwMjQgMTY6NTI6MTcgLTA4MDAKU3ViamVjdDogW1BBVENIIHYxXSBIYXNoQWdn OiBjb21wbGV0ZWx5IHJlYnVpbGQgaGFzaCB0YWJsZXMgZWFjaCBpdGVyYXRpb24uCgotLS0KIHNy Yy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVBZ2cuYyB8IDEwICsrLS0tLS0tLS0KIDEgZmlsZSBjaGFu Z2VkLCAyIGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvZXhlY3V0b3Ivbm9kZUFnZy5jIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUFnZy5j CmluZGV4IDUzZWFkNzdlY2UuLjliMjlkNjdiN2QgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL25vZGVBZ2cuYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlQWdnLmMKQEAg LTE0NjksMTggKzE0NjksMTMgQEAgYnVpbGRfaGFzaF90YWJsZXMoQWdnU3RhdGUgKmFnZ3N0YXRl KQogewogCWludAkJCXNldG5vOwogCisJTWVtb3J5Q29udGV4dFJlc2V0KGFnZ3N0YXRlLT5oYXNo X21ldGFjeHQpOwogCWZvciAoc2V0bm8gPSAwOyBzZXRubyA8IGFnZ3N0YXRlLT5udW1faGFzaGVz OyArK3NldG5vKQogCXsKIAkJQWdnU3RhdGVQZXJIYXNoIHBlcmhhc2ggPSAmYWdnc3RhdGUtPnBl cmhhc2hbc2V0bm9dOwogCQlsb25nCQluYnVja2V0czsKIAkJU2l6ZQkJbWVtb3J5OwogCi0JCWlm IChwZXJoYXNoLT5oYXNodGFibGUgIT0gTlVMTCkKLQkJewotCQkJUmVzZXRUdXBsZUhhc2hUYWJs ZShwZXJoYXNoLT5oYXNodGFibGUpOwotCQkJY29udGludWU7Ci0JCX0KLQogCQlBc3NlcnQocGVy aGFzaC0+YWdnbm9kZS0+bnVtR3JvdXBzID4gMCk7CiAKIAkJbWVtb3J5ID0gYWdnc3RhdGUtPmhh c2hfbWVtX2xpbWl0IC8gYWdnc3RhdGUtPm51bV9oYXNoZXM7CkBAIC0yNjIyLDggKzI2MTcsNyBA QCBhZ2dfcmVmaWxsX2hhc2hfdGFibGUoQWdnU3RhdGUgKmFnZ3N0YXRlKQogCiAJLyogZnJlZSBt ZW1vcnkgYW5kIHJlc2V0IGhhc2ggdGFibGVzICovCiAJUmVTY2FuRXhwckNvbnRleHQoYWdnc3Rh dGUtPmhhc2hjb250ZXh0KTsKLQlmb3IgKGludCBzZXRubyA9IDA7IHNldG5vIDwgYWdnc3RhdGUt Pm51bV9oYXNoZXM7IHNldG5vKyspCi0JCVJlc2V0VHVwbGVIYXNoVGFibGUoYWdnc3RhdGUtPnBl cmhhc2hbc2V0bm9dLmhhc2h0YWJsZSk7CisJYnVpbGRfaGFzaF90YWJsZXMoYWdnc3RhdGUpOwog CiAJYWdnc3RhdGUtPmhhc2hfbmdyb3Vwc19jdXJyZW50ID0gMDsKIAotLSAKMi4zNC4xCgo= --=-YkGXPjRUS9ylOtLVVDZk--