Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1aCtDK-0002uz-DQ for pgsql-hackers@arkaria.postgresql.org; Sat, 26 Dec 2015 18:05:10 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84) (envelope-from ) id 1aCtDK-0004yq-03 for pgsql-hackers@arkaria.postgresql.org; Sat, 26 Dec 2015 18:05:10 +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_SHA384:256) (Exim 4.84) (envelope-from ) id 1aCtDE-0004n8-Ac for pgsql-hackers@postgresql.org; Sat, 26 Dec 2015 18:05:04 +0000 Received: from hook.sigaev.ru ([93.180.27.50]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84) (envelope-from ) id 1aCtDA-0001n7-4w for pgsql-hackers@postgresql.org; Sat, 26 Dec 2015 18:05:03 +0000 Received: from xor.sai.msu.ru (93-80-5-82.broadband.corbina.ru [93.80.5.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: teodor) by hook.sigaev.ru (Postfix) with ESMTPSA id 36499B1918A for ; Sat, 26 Dec 2015 21:04:59 +0300 (MSK) To: Pgsql Hackers From: Teodor Sigaev Subject: POC, WIP: OR-clause support for indexes Message-ID: <567ED6CA.2040504@sigaev.ru> Date: Sat, 26 Dec 2015 21:04:58 +0300 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:42.0) Gecko/20100101 Firefox/42.0 SeaMonkey/2.39 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------060804060407090805090607" X-Pg-Spam-Score: -1.9 (-) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org This is a multi-part message in MIME format. --------------060804060407090805090607 Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 7bit I'd like to present OR-clause support for indexes. Although OR-clauses could be supported by bitmapOR index scan it isn't very effective and such scan lost any order existing in index. We (with Alexander Korotkov) presented results on Vienna's conference this year. In short, it provides performance improvement: EXPLAIN ANALYZE SELECT count(*) FROM tst WHERE id = 5 OR id = 500 OR id = 5000; me=0.080..0.267 rows=173 loops=1) Recheck Cond: ((id = 5) OR (id = 500) OR (id = 5000)) Heap Blocks: exact=172 -> Bitmap Index Scan on idx_gin (cost=0.00..57.50 rows=15000 width=0) (actual time=0.059..0.059 rows=147 loops=1) Index Cond: ((id = 5) OR (id = 500) OR (id = 5000)) Planning time: 0.077 ms Execution time: 0.308 ms <------- QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------- Aggregate (cost=51180.53..51180.54 rows=1 width=0) (actual time=796.766..796.766 rows=1 loops=1) -> Index Only Scan using idx_btree on tst (cost=0.42..51180.40 rows=55 width=0) (actual time=0.444..796.736 rows=173 loops=1) Filter: ((id = 5) OR (id = 500) OR (id = 5000)) Rows Removed by Filter: 999829 Heap Fetches: 1000002 Planning time: 0.087 ms Execution time: 796.798 ms <------ QUERY PLAN ------------------------------------------------------------------------------------------------------------- Aggregate (cost=21925.63..21925.64 rows=1 width=0) (actual time=160.412..160.412 rows=1 loops=1) -> Seq Scan on tst (cost=0.00..21925.03 rows=237 width=0) (actual time=0.535..160.362 rows=175 loops=1) Filter: ((id = 5) OR (id = 500) OR (id = 5000)) Rows Removed by Filter: 999827 Planning time: 0.459 ms Execution time: 160.451 ms It also could work together with KNN feature of GiST and in this case performance improvement could be up to several orders of magnitude, in artificial example it was 37000 times faster. Not all indexes can support oR-clause, patch adds support to GIN, GiST and BRIN indexes. pg_am table is extended for adding amcanorclause column which indicates possibility of executing of OR-clause by index. indexqual and indexqualorig doesn't contain implicitly-ANDed list of index qual expressions, now that lists could contain OR RestrictionInfo. Actually, the patch just tries to convert BitmapOr node to IndexScan or IndexOnlyScan. Thats significantly simplifies logic to find possible clause's list for index. Index always gets a array of ScanKey but for indexes which support OR-clauses array of ScanKey is actually exection tree in reversed polish notation form. Transformation is done in ExecInitIndexScan(). The problems on the way which I see for now: 1 Calculating cost. Right now it's just a simple transformation of costs computed for BitmapOr path. I'd like to hope that's possible and so index's estimation function could be non-touched. So, they could believe that all clauses are implicitly-ANDed 2 I'd like to add such support to btree but it seems that it should be a separated patch. Btree search algorithm doesn't use any kind of stack of pages and algorithm to walk over btree doesn't clear for me for now. 3 I could miss some places which still assumes implicitly-ANDed list of clauses although regression tests passes fine. Hope, hackers will not have an strong objections to do that. But obviously patch requires further work and I'd like to see comments, suggestions and recommendations. Thank you. -- Teodor Sigaev E-mail: teodor@sigaev.ru WWW: http://www.sigaev.ru/ --------------060804060407090805090607 Content-Type: application/x-gzip; name="index_or-1.patch.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="index_or-1.patch.gz" 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 sKWA9jm5Tee7ZJR6ZJyICse5u2JyPFCK/FIxWzHTxznIckeOZy7hPXlerWR+ EqaX/5y5Xib5zkq+p3eDbTkf1kmzPnyWz/uSPDsW81MVLO5XU5OS7M9E24eV ClL49cjkHebmakMB2FYOstyHa5oYswXf3GZrluKcRtPInHzOub1wDJxGIqx9 gslYVym3JrK9WxW6IorzrpLnZXkszc5RLYG7KygiKWOcTDI2ilrmGe0U1mN7 q7Bf2XuFJUlYCoDr60M4K2SK87ELEz/AszFa2EryBdivxG7kstCV8yqlOxhI dgeurdDzfmxbtrIp307vYvmcO09iuSPrZjv3iYfUpxJDSbKv1+ucbOWLSgLZ jdtiJuaWnMdNePxnW282adEasWrjjcYonHYd5UrXpQ2Fa0xhdqEyJxH+qye0 V6B3rayfrMD2u7E1cyHuw9iw/haczciptzVvs7fz3D0+hx8V5Npbx5L0jn9X pnRPXJ3HhHPmwfZ8EGmNWdZI63q5CmAuhmKZ7Y5jYqOFpzEVnq7kN8khEwW2 z0nFuwHPEijvTuk2YpXyZcrSxiKlSe12hoUis/EQqW5TU69eXyHN0abBMPUk FQ+ca8lNDLAZey4turbn7uzlGC0zhkrTOMkWhDtYIM0rj9abCNcGkgtF4Zux XZy2TA7hcrKmJDOEYbDSx2nSSSIwci3IydHAhlMspVrDgKQkrUWSfSKVUOFY XR6QpKCY6gUqleiXv/8Q1HQPXlTLoZb8p4obGdsJIZTcSgiXFApl818M1ZrY sJWIYxfNXwa5DlxYQZkX0Yo3Nl/YaaNXEzLTrnTMqBHzNx0EWEpCMHMIUo0h /Qr9VMZBZOPIPaey3Yaj08qsOmDPgKcU6yv8AIR0W03BNPRuVdNYAiDgIo+Z BX3tCJNol04doE7aZLxbeIBPXtpe6HffewC/+16+331PyAvji/zue3f0u+89 kN99775+972H87vvPajffe8B/e57ht9dLelD+N33HtLvvvfAfve9B/G775HM aPvdCwWobfzuvyWS6MZsPO0at3eDIu9tseN2304opMcho7ZMJrNBDNUy9qcU pDR2s7eVFRVT2R7a7abXucToqfbYHbubRE+lGloVOpUqSgnmmpTeA//IZARk vXdZfMP4zZzFxBPbqpBKhiwP+/rzazQdYHZlQfsVxxYGC76xlrP60WRV4hYj 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 cAEA --------------060804060407090805090607 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers --------------060804060407090805090607--