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.96) (envelope-from ) id 1vxAx3-001a6Z-1g for pgsql-hackers@arkaria.postgresql.org; Mon, 02 Mar 2026 21:37:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vxAx1-0034Zs-2u for pgsql-hackers@arkaria.postgresql.org; Mon, 02 Mar 2026 21:37:16 +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.96) (envelope-from ) id 1vxAx1-0034Zk-1r for pgsql-hackers@lists.postgresql.org; Mon, 02 Mar 2026 21:37:16 +0000 Received: from mail-yx1-xb134.google.com ([2607:f8b0:4864:20::b134]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vxAx0-000000004ql-09qy for pgsql-hackers@lists.postgresql.org; Mon, 02 Mar 2026 21:37:15 +0000 Received: by mail-yx1-xb134.google.com with SMTP id 956f58d0204a3-64caaacb9bcso4704954d50.1 for ; Mon, 02 Mar 2026 13:37:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772487433; cv=none; d=google.com; s=arc-20240605; b=khUgEEnSv+8j0/57T0cYbTZBJeDNyGsEWQODgNQDSJqvwPIfk/M89+gHnK++L24Vf7 VP+KDVnuuXcxmd2Sth3iwklQva40+M/we4g757N0ra2+UdGNOppz9K/bpTxEZ/sDWnAu N5tbYuoM1yHa/EawJjdKtOg1fSOjVt2pfbayiBKDhaCUXGHv+IDdJsS8Q/lvXhV7fXdR SBe4zBP/clgvt3tCBP/uQ2dVhHZA+AqiQ7OXlzuKkGo645bd/vdhCngXjN9mZGtEhjrz n3xCoZyZlpbseYv93tsz/9LqZT0SWAccchrz9LvJYklRKudtK3pgpQnbQk2On/Nywlkb 64HQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=tEbGhPCyOyLbV62YLeuf6giW7ITDr9p4ClurAiSu3Mo=; fh=GP4CEPDyuY/Ng+vvvLPoLGzS73m6EXZ22U30Ds0tEKU=; b=EFzwr/i0lUOOUSr/ZQ2bNmJoLmANoDeyxhV7h6owawa7IVf8PRW/WKJBK6wjoYKTZX rCLiaKa9hxLRXtqSZ0lrEAkA/xI/4imtSXrnAzyf8mHItF1YQytWO21QkjJoVaUPfLe+ Xn1MGmIlGKpgY1Oi3B36Y/a6sc/f8y8sqX/9HTpRMnox407YzXZ9h4o/LvoUz8Z0vmv2 vXmrbXx0IwNRH4vHaZvvSz/RawxPXXFge1ZnpeEXwp1qap6zfKLufHSCbF6goaZlLAxj ZO4XmIdl5ZxJi8KVg5AbRpF6fwDHAn0+MUaRq0S/kuW3j6SK9CMgQ3Uxsj2Dv9oCi0K4 8YFw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=percona.com; s=google; t=1772487433; x=1773092233; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=tEbGhPCyOyLbV62YLeuf6giW7ITDr9p4ClurAiSu3Mo=; b=VkbxhbvhAQouTWmU9SOFrlPkAm5lAMLNjZx59i578LiUdpSfZ8VuxKSl+6C1CusUhQ lnh+Nb8ccNcfW39Xmx/VC5m4YKD1bfN6LiUbDKvOtgrpy8qJG6JtyHri4GF+d2hzGC2n F949GnS6zu13PvTYveL0iVuKZPPY0O1lVfBzc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772487433; x=1773092233; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=tEbGhPCyOyLbV62YLeuf6giW7ITDr9p4ClurAiSu3Mo=; b=hhPPv2OVnENUrK/hXA7ZNrmS5wpBSbHaEGeJSIHDprKDttWNuh+11OW5ZQ+qIRiImI lV+tmDGes0lDkg4M2fg/VAiEUts193ssbYO3UcLjWGwzmuyB5bP3bCbnMLT4dRV6YBoY V01eBGaC3F72Kv9wHC97mgaAQioYwe8wmDi3DvZIGsfXWtwjVIciurp0Q46tOMGcWJve I9vOjjR69lbLeRXVLpPJIheS70yHX1avy/87+r0C+D6295z1SAawyXataiFoEdqCnfKy BSSalfRncKrqdFtHMHeXYI947PomSZmGRzCn9rwOtmt0mN8XiRWyNTFW8k2znbndOvcl eG/Q== X-Forwarded-Encrypted: i=1; AJvYcCXEIXd/oSU81Jrb12garTwvov/t6r+17W3FL8iXx06OtWWzJDsTQy9bhCysN0lyzex1qQPdor3S4fZcQeyW@lists.postgresql.org X-Gm-Message-State: AOJu0YzDG8lBsPX1t4YAZIzUVZ5ig+nzKCICEYDjlFghPZ+kwxn8yV4P +ZEGAVtc1MJjflxquxWb5WSSKOVzrpBz9X2/jgdiyDXQu7B50t1rrZQLpONd7WHQLcgTxj2Ty7p bKDoLKYY4WvfaOrHj3AEvMfek8I/xziW+fPrXZiTdGUhbKebeRALBqcwvD1Pe4w3tK3h9BGDPkp eE+ZE65UR2E+NFoMIPPF+szyWnQG9dCyuAs65tZrNooKbcYndw4myqEwyn67Xf86AqOSyfdg/Xo /Ja/gm8Ev1yCyUaEBVUFIgHrNwMyWmaeS+RKPIi9DGRuk7S2BvzPsFlGJ4kIfP3ceg= X-Gm-Gg: ATEYQzxc5izD7k+079bU0dlsM5bG5i2PoTP00MEeQZoF4c7RJ1fWZf30RE67Tnv+APC 17xiiWmLcX6U6jbqlZImp7SPqgaAlD1QdfDF5Fw0/LAI81XjYX4MRGPQR7/MCTRU2UnB9qm5aSn L8CEuZf2VwUz6VGKV8N8lWaGlHqJWtFbS5UKORYCcLMqDpSw1mWPSU6PfdNAps4np/buTwTXmde Euu969On9bTWD12uZ16eeDbF8uHsgjsimcR2pQY9bW4ozBUrkq5vVkX16z2+ZnU/6ll//ZGHyRe IgZNCiWdKnkzbARRgc/FY7XWZh+sgR867o7PA9zuO01fLINPgGMCKn1XV/hLXqwjEztGsvMHqxf CilU= X-Received: by 2002:a05:690c:d1a:b0:797:be09:5dac with SMTP id 00721157ae682-798854699c0mr119918357b3.8.1772487433095; Mon, 02 Mar 2026 13:37:13 -0800 (PST) MIME-Version: 1.0 References: <7db341e0-fbc6-4ec5-922c-11fdafe7be12@tantorlabs.com> <988e3168-6096-488a-bb42-787e1e8c21a4@tantorlabs.com> <21FF6A0B-886F-4132-B6A6-0F4E934B4CEE@Outlook.com> <8ee9d903-bb13-434c-8145-b3769bf2b3cb@tantorlabs.com> <9e3054ae-1c5d-46dd-9b6a-7fb67764b076@tantorlabs.com> <9067a807-f130-4631-8df4-076c6d7e43b6@tantorlabs.com> <03aa576f-13bb-4ed1-bee4-0ee69ad8813c@tantorlabs.com> In-Reply-To: <03aa576f-13bb-4ed1-bee4-0ee69ad8813c@tantorlabs.com> From: Zsolt Parragi Date: Mon, 2 Mar 2026 21:37:01 +0000 X-Gm-Features: AaiRm53d7hAlYYf5ujToxt-HImzHHFMK6uDzz1NpMvRcHzQzU1btOnOqG1QG12Q Message-ID: Subject: Re: Hash-based MCV matching for large IN-lists To: Ilia Evdokimov Cc: David Geier , Chengpeng Yan , Tatsuya Kawata , "pgsql-hackers@lists.postgresql.org" Content-Type: text/plain; charset="UTF-8" X-CLOUD-SEC-AV-Sent: true X-CLOUD-SEC-AV-Info: percona,google_mail,monitor X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Hello! + if (vardata.isunique && vardata.rel && vardata.rel->tuples >= 1.0) + { + s2 = 1.0 / vardata.rel->tuples; + if (HeapTupleIsValid(vardata.statsTuple)) + { + Form_pg_statistic stats = (Form_pg_statistic) GETSTRUCT(vardata.statsTuple); + if (isInequality) + s2 = 1.0 - s2 - stats->stanullfrac; + } + } Isn't there's a corner case where this if order returns an incorrect estimate/regression? See the following test: CREATE TABLE test AS SELECT generate_series(1, 1000) AS id; CREATE UNIQUE INDEX ON test(id); -- no ANALYZE EXPLAIN SELECT * FROM test WHERE id <> ALL(ARRAY[1, 2, 3]); -- Actual: rows=1 -- Expected: rows=997 ANALYZE test; EXPLAIN SELECT * FROM test WHERE id <> ALL(ARRAY[1, 2, 3]); -- Correct: rows=997 DROP TABLE test;