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 1ty8hk-002vIF-05 for pgsql-hackers@arkaria.postgresql.org; Fri, 28 Mar 2025 12:20:56 +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 1ty8hi-0092wp-Jr for pgsql-hackers@arkaria.postgresql.org; Fri, 28 Mar 2025 12:20:54 +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 1ty8hi-0092rb-1w for pgsql-hackers@lists.postgresql.org; Fri, 28 Mar 2025 12:20:54 +0000 Received: from forward500b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:d500]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1ty8hf-001hi8-1N for pgsql-hackers@lists.postgresql.org; Fri, 28 Mar 2025 12:20:53 +0000 Received: from mail-nwsmtp-smtp-production-main-98.sas.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-98.sas.yp-c.yandex.net [IPv6:2a02:6b8:c16:123:0:640:744c:0]) by forward500b.mail.yandex.net (Yandex) with ESMTPS id 03D23616C5; Fri, 28 Mar 2025 15:20:49 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-98.sas.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id iKRFx1TLj4Y0-oQrHjHca; Fri, 28 Mar 2025 15:20:48 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1743164448; bh=/UmYsxoSHzBzYCLENGXEVQdVDpG74D51KUfF8k8Qdpo=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=ecF01eF8/DfneWtjNfp2hprErErNlHFmcLfzIMXyojoZZhUO20ZiH7XVvImZIOtB/ H+C67ZDkQWUQ0XbYvEp3FHYhPY/Q/IEvOQSJRSOdp3aSrbCB7wnUb2O4wLxYoHngFy 7bsGktndmH0noFONNYGnp0JzmdN1eU+0OnPe5vRw= Authentication-Results: mail-nwsmtp-smtp-production-main-98.sas.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------U0nVSZOZh9lnPA6OzfUqbKB8" Message-ID: <67b5c84a-dedd-4103-af7e-0117046102fe@tantorlabs.com> Date: Fri, 28 Mar 2025 15:20:44 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Add estimated hit ratio to Memoize in EXPLAIN to explain cost adjustment To: Andrei Lepikhov , Robert Haas , Tom Lane Cc: Lukas Fittl , David Rowley , Daniel Gustafsson , PostgreSQL Hackers , Nikolay Samokhvalov References: <44229379-3901-4cb0-8812-b354ef70d5e2@gmail.com> <8e12aa55-39eb-4e03-a8f7-077fe02309c3@gmail.com> <11c709e1-9b17-4c00-9ead-93609a09b9db@gmail.com> <1161645.1742854534@sss.pgh.pa.us> <1164845.1742856354@sss.pgh.pa.us> <3ba16aa7-3cb2-4289-b773-522ae2f03a77@tantorlabs.com> <81ef0f5a-b6a1-4417-ae3a-2bae9b8d419e@gmail.com> Content-Language: en-US From: Ilia Evdokimov In-Reply-To: <81ef0f5a-b6a1-4417-ae3a-2bae9b8d419e@gmail.com> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------U0nVSZOZh9lnPA6OzfUqbKB8 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Then we need to decide clearly what exactly to display in EXPLAIN for the Memoize node: absolute values (estimated distinct keys and estimated cache capacity) or ratios (hit_ratio and evict_ratio). Ratios have the advantage of quickly reflecting the overall effectiveness of Memoize. However, absolute values have a significant advantage as they explicitly reveal the reason of Memoize's poor performance, making problem diagnosis simpler. With absolute values, users can directly understand the underlying reason for poor performance. For example: insufficient memory (capacity < distinct keys), inaccurate planner statistics (distinct keys significantly different from actual values), poorly ordered keys (capacity ~ distinct keys, but frequent evictions as seen in the Evictions parameter), or Memoize simply not being beneficial (capacity ~ distinct keys ~ calls). Ratios, by contrast, only reflect the final outcome without clearly indicating the cause or the specific steps needed to resolve the issue. Thus, absolute values do more than just inform users that a problem exists; they provide actionable details that enable users to directly address the problem (increase work_mem, refresh statistics, create extended statistics, or disable Memoize entirely). Additionally, no other plan nodes in PostgreSQL currently use a similar ratio-based approach - everywhere else absolute values are consistently shown (e.g., number of rows, buckets, batches, memory used, etc.). Using absolute values in Memoize maintains consistency with existing practice. I've updated the patch to v5, since the new parameter est_unique_keys in make_memoize() is now placed near est_entries, which is more logical and readable than putting it at the end. Any thoughts? -- Best Regards, Ilia Evdokimov, Tantor Labs LLC. --------------U0nVSZOZh9lnPA6OzfUqbKB8 Content-Type: text/x-patch; charset=UTF-8; name="v5-0001-Show-ndistinct-and-est_entries-in-EXPLAIN-for-Memoize.patch" Content-Disposition: attachment; filename*0="v5-0001-Show-ndistinct-and-est_entries-in-EXPLAIN-for-Memoiz"; filename*1="e.patch" Content-Transfer-Encoding: base64 RnJvbSA3OWFmMzNlNDk5NzMwYTRiZDA1NTM4MzJiMjNiZjY4YzkwODE3YzZlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBFdmRva2ltb3YgSWxpYSA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5jb20+CkRhdGU6IEZyaSwgMjggTWFyIDIwMjUgMTU6MTc6MDkgKzAzMDAK U3ViamVjdDogW1BBVENIIHY1XSBTaG93IG5kaXN0aW5jdCBhbmQgZXN0X2VudHJpZXMgaW4g RVhQTEFJTiBmb3IgTWVtb2l6ZQoKLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWlu LmMgICAgICAgICAgfCAxNiArKysrKysrKysrKysrKysrCiBzcmMvYmFja2VuZC9vcHRpbWl6 ZXIvcGF0aC9jb3N0c2l6ZS5jICAgfCAgMyArKysKIHNyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL2NyZWF0ZXBsYW4uYyB8IDEwICsrKysrKystLS0KIHNyYy9iYWNrZW5kL29wdGltaXpl ci91dGlsL3BhdGhub2RlLmMgICB8ICAzICsrKwogc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5v ZGVzLmggICAgICAgICAgIHwgIDIgKysKIHNyYy9pbmNsdWRlL25vZGVzL3BsYW5ub2Rlcy5o ICAgICAgICAgICB8ICA2ICsrKysrKwogNiBmaWxlcyBjaGFuZ2VkLCAzNyBpbnNlcnRpb25z KCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRz L2V4cGxhaW4uYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxhaW4uYwppbmRleCAzOTFi MzRhMmFmMi4uMmJhY2Y3Zjg1Y2IgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRz L2V4cGxhaW4uYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKQEAgLTM2 MjgsNiArMzYyOCwyMiBAQCBzaG93X21lbW9pemVfaW5mbyhNZW1vaXplU3RhdGUgKm1zdGF0 ZSwgTGlzdCAqYW5jZXN0b3JzLCBFeHBsYWluU3RhdGUgKmVzKQogCUV4cGxhaW5Qcm9wZXJ0 eVRleHQoIkNhY2hlIEtleSIsIGtleXN0ci5kYXRhLCBlcyk7CiAJRXhwbGFpblByb3BlcnR5 VGV4dCgiQ2FjaGUgTW9kZSIsIG1zdGF0ZS0+YmluYXJ5X21vZGUgPyAiYmluYXJ5IiA6ICJs b2dpY2FsIiwgZXMpOwogCisJaWYgKGVzLT5jb3N0cykKKwl7CisJCWlmIChlcy0+Zm9ybWF0 ID09IEVYUExBSU5fRk9STUFUX1RFWFQpCisJCXsKKwkJCUV4cGxhaW5JbmRlbnRUZXh0KGVz KTsKKwkJCWFwcGVuZFN0cmluZ0luZm8oZXMtPnN0ciwgIkVzdGltYXRlZCBDYXBhY2l0eTog JXUgIEVzdGltYXRlZCBEaXN0aW5jdCBMb29rdXAgS2V5czogJTAuMGZcbiIsCisJCQkJCQkJ KChNZW1vaXplICopIHBsYW4pLT5lc3RfZW50cmllcywKKwkJCQkJCQkoKE1lbW9pemUgKikg cGxhbiktPmVzdF91bmlxdWVfa2V5cyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlFeHBsYWlu UHJvcGVydHlVSW50ZWdlcigiRXN0aW1hdGVkIENhcGFjaXR5IiwgIiIsICgoTWVtb2l6ZSAq KSBwbGFuKS0+ZXN0X2VudHJpZXMsIGVzKTsKKwkJCUV4cGxhaW5Qcm9wZXJ0eUZsb2F0KCJF c3RpbWF0ZWQgRGlzdGluY3QgTG9va3VwIEtleXMiLCAiIiwgKChNZW1vaXplICopIHBsYW4p LT5lc3RfdW5pcXVlX2tleXMsIDAsIGVzKTsKKwkJfQorCX0KKwogCXBmcmVlKGtleXN0ci5k YXRhKTsKIAogCWlmICghZXMtPmFuYWx5emUpCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgv Y29zdHNpemUuYwppbmRleCBmNmY3N2I4ZmUxOS4uZTNhYmY5Y2NjMjYgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKKysrIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BhdGgvY29zdHNpemUuYwpAQCAtMjYwNCw2ICsyNjA0LDkgQEAgY29z dF9tZW1vaXplX3Jlc2NhbihQbGFubmVySW5mbyAqcm9vdCwgTWVtb2l6ZVBhdGggKm1wYXRo LAogCW1wYXRoLT5lc3RfZW50cmllcyA9IE1pbihNaW4obmRpc3RpbmN0LCBlc3RfY2FjaGVf ZW50cmllcyksCiAJCQkJCQkJIFBHX1VJTlQzMl9NQVgpOwogCisJLyogUmVtZW1iZXIgbmRp c3RpbmN0IGZvciBhIHBvdGVudGlhbCBFWFBMQUlOIGxhdGVyICovCisJbXBhdGgtPmVzdF91 bmlxdWVfa2V5cyA9IG5kaXN0aW5jdDsKKwogCS8qCiAJICogV2hlbiB0aGUgbnVtYmVyIG9m IGRpc3RpbmN0IHBhcmFtZXRlciB2YWx1ZXMgaXMgYWJvdmUgdGhlIGFtb3VudCB3ZSBjYW4K IAkgKiBzdG9yZSBpbiB0aGUgY2FjaGUsIHRoZW4gd2UnbGwgaGF2ZSB0byBldmljdCBzb21l IGVudHJpZXMgZnJvbSB0aGUKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL2NyZWF0ZXBsYW4uYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBs YW4uYwppbmRleCA3NWUyYjBiOTAzNi4uMzg4ODI1MDE0ODQgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBsYW4uYworKysgYi9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGxhbi9jcmVhdGVwbGFuLmMKQEAgLTI4NCw3ICsyODQsOCBAQCBzdGF0aWMg TWF0ZXJpYWwgKm1ha2VfbWF0ZXJpYWwoUGxhbiAqbGVmdHRyZWUpOwogc3RhdGljIE1lbW9p emUgKm1ha2VfbWVtb2l6ZShQbGFuICpsZWZ0dHJlZSwgT2lkICpoYXNob3BlcmF0b3JzLAog CQkJCQkJCSBPaWQgKmNvbGxhdGlvbnMsIExpc3QgKnBhcmFtX2V4cHJzLAogCQkJCQkJCSBi b29sIHNpbmdsZXJvdywgYm9vbCBiaW5hcnlfbW9kZSwKLQkJCQkJCQkgdWludDMyIGVzdF9l bnRyaWVzLCBCaXRtYXBzZXQgKmtleXBhcmFtaWRzKTsKKwkJCQkJCQkgdWludDMyIGVzdF9l bnRyaWVzLCBkb3VibGUgZXN0X3VuaXF1ZV9rZXlzLAorCQkJCQkJCSBCaXRtYXBzZXQgKmtl eXBhcmFtaWRzKTsKIHN0YXRpYyBXaW5kb3dBZ2cgKm1ha2Vfd2luZG93YWdnKExpc3QgKnRs aXN0LCBXaW5kb3dDbGF1c2UgKndjLAogCQkJCQkJCQkgaW50IHBhcnROdW1Db2xzLCBBdHRy TnVtYmVyICpwYXJ0Q29sSWR4LCBPaWQgKnBhcnRPcGVyYXRvcnMsIE9pZCAqcGFydENvbGxh dGlvbnMsCiAJCQkJCQkJCSBpbnQgb3JkTnVtQ29scywgQXR0ck51bWJlciAqb3JkQ29sSWR4 LCBPaWQgKm9yZE9wZXJhdG9ycywgT2lkICpvcmRDb2xsYXRpb25zLApAQCAtMTcwMyw3ICsx NzA0LDggQEAgY3JlYXRlX21lbW9pemVfcGxhbihQbGFubmVySW5mbyAqcm9vdCwgTWVtb2l6 ZVBhdGggKmJlc3RfcGF0aCwgaW50IGZsYWdzKQogCiAJcGxhbiA9IG1ha2VfbWVtb2l6ZShz dWJwbGFuLCBvcGVyYXRvcnMsIGNvbGxhdGlvbnMsIHBhcmFtX2V4cHJzLAogCQkJCQkJYmVz dF9wYXRoLT5zaW5nbGVyb3csIGJlc3RfcGF0aC0+YmluYXJ5X21vZGUsCi0JCQkJCQliZXN0 X3BhdGgtPmVzdF9lbnRyaWVzLCBrZXlwYXJhbWlkcyk7CisJCQkJCQliZXN0X3BhdGgtPmVz dF9lbnRyaWVzLCBiZXN0X3BhdGgtPmVzdF91bmlxdWVfa2V5cywKKwkJCQkJCWtleXBhcmFt aWRzKTsKIAogCWNvcHlfZ2VuZXJpY19wYXRoX2luZm8oJnBsYW4tPnBsYW4sIChQYXRoICop IGJlc3RfcGF0aCk7CiAKQEAgLTY2MzYsNyArNjYzOCw4IEBAIG1hdGVyaWFsaXplX2Zpbmlz aGVkX3BsYW4oUGxhbiAqc3VicGxhbikKIHN0YXRpYyBNZW1vaXplICoKIG1ha2VfbWVtb2l6 ZShQbGFuICpsZWZ0dHJlZSwgT2lkICpoYXNob3BlcmF0b3JzLCBPaWQgKmNvbGxhdGlvbnMs CiAJCQkgTGlzdCAqcGFyYW1fZXhwcnMsIGJvb2wgc2luZ2xlcm93LCBib29sIGJpbmFyeV9t b2RlLAotCQkJIHVpbnQzMiBlc3RfZW50cmllcywgQml0bWFwc2V0ICprZXlwYXJhbWlkcykK KwkJCXVpbnQzMiBlc3RfZW50cmllcywgZG91YmxlIGVzdF91bmlxdWVfa2V5cywKKwkJCUJp dG1hcHNldCAqa2V5cGFyYW1pZHMpCiB7CiAJTWVtb2l6ZSAgICAqbm9kZSA9IG1ha2VOb2Rl KE1lbW9pemUpOwogCVBsYW4JICAgKnBsYW4gPSAmbm9kZS0+cGxhbjsKQEAgLTY2NTQsNiAr NjY1Nyw3IEBAIG1ha2VfbWVtb2l6ZShQbGFuICpsZWZ0dHJlZSwgT2lkICpoYXNob3BlcmF0 b3JzLCBPaWQgKmNvbGxhdGlvbnMsCiAJbm9kZS0+YmluYXJ5X21vZGUgPSBiaW5hcnlfbW9k ZTsKIAlub2RlLT5lc3RfZW50cmllcyA9IGVzdF9lbnRyaWVzOwogCW5vZGUtPmtleXBhcmFt aWRzID0ga2V5cGFyYW1pZHM7CisJbm9kZS0+ZXN0X3VuaXF1ZV9rZXlzID0gZXN0X3VuaXF1 ZV9rZXlzOwogCiAJcmV0dXJuIG5vZGU7CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwv cGF0aG5vZGUuYwppbmRleCA5M2U3M2NiNDRkYi4uMWZiY2RhOTkwNjcgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMKKysrIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUuYwpAQCAtMTcwMSw2ICsxNzAxLDkgQEAgY3Jl YXRlX21lbW9pemVfcGF0aChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBQ YXRoICpzdWJwYXRoLAogCUFzc2VydChlbmFibGVfbWVtb2l6ZSk7CiAJcGF0aG5vZGUtPnBh dGguZGlzYWJsZWRfbm9kZXMgPSBzdWJwYXRoLT5kaXNhYmxlZF9ub2RlczsKIAorCS8qIEVz dGltYXRlZCBudW1iZXIgb2YgZGlzdGluY3QgbWVtb2l6YXRpb24ga2V5cywgY29tcHV0ZWQg dXNpbmcgZXN0aW1hdGVfbnVtX2dyb3VwcygpICovCisJcGF0aG5vZGUtPmVzdF91bmlxdWVf a2V5cyA9IDA7CisKIAkvKgogCSAqIEFkZCBhIHNtYWxsIGFkZGl0aW9uYWwgY2hhcmdlIGZv ciBjYWNoaW5nIHRoZSBmaXJzdCBlbnRyeS4gIEFsbCB0aGUKIAkgKiBoYXJkZXIgY2FsY3Vs YXRpb25zIGZvciByZXNjYW5zIGFyZSBwZXJmb3JtZWQgaW4gY29zdF9tZW1vaXplX3Jlc2Nh bigpLgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmggYi9zcmMv aW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaAppbmRleCBjMjRhMWZjODUxNC4uMDk0NmNjZWE5 OTQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oCisrKyBiL3Ny Yy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oCkBAIC0yMDQwLDYgKzIwNDAsOCBAQCB0eXBl ZGVmIHN0cnVjdCBNZW1vaXplUGF0aAogCXVpbnQzMgkJZXN0X2VudHJpZXM7CS8qIFRoZSBt YXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgdGhlCiAJCQkJCQkJCSAqIHBsYW5uZXIg ZXhwZWN0cyB3aWxsIGZpdCBpbiB0aGUgY2FjaGUsIG9yIDAKIAkJCQkJCQkJICogaWYgdW5r bm93biAqLworCWRvdWJsZQkJZXN0X3VuaXF1ZV9rZXlzOwkJLyogRXN0aW1hdGVkIG51bWJl ciBvZiBkaXN0aW5jdCBtZW1vaXphdGlvbiBrZXlzLAorCQkJCQkJCQkgKiB1c2VkIGZvciBj YWNoZSBzaXplIGV2YWx1YXRpb24uIEtlcHQgZm9yIEVYUExBSU4gKi8KIH0gTWVtb2l6ZVBh dGg7CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wbGFubm9kZXMuaCBi L3NyYy9pbmNsdWRlL25vZGVzL3BsYW5ub2Rlcy5oCmluZGV4IDY1OGQ3NjIyNWU0Li4zZDlk M2ExMTU5ZCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvcGxhbm5vZGVzLmgKKysr IGIvc3JjL2luY2x1ZGUvbm9kZXMvcGxhbm5vZGVzLmgKQEAgLTEwNjMsNiArMTA2MywxMiBA QCB0eXBlZGVmIHN0cnVjdCBNZW1vaXplCiAKIAkvKiBwYXJhbWlkcyBmcm9tIHBhcmFtX2V4 cHJzICovCiAJQml0bWFwc2V0ICAqa2V5cGFyYW1pZHM7CisKKwkvKgorCSAqIEVzdGltYXRl ZCBudW1iZXIgb2YgZGlzdGluY3QgbWVtb2l6YXRpb24ga2V5cywKKwkgKiB1c2VkIGZvciBj YWNoZSBzaXplIGV2YWx1YXRpb24uIEtlcHQgZm9yIEVYUExBSU4KKwkgKi8KKwlkb3VibGUJ CWVzdF91bmlxdWVfa2V5czsKIH0gTWVtb2l6ZTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLQot LSAKMi4zNC4xCgo= --------------U0nVSZOZh9lnPA6OzfUqbKB8--