Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qH0Pn-0006pb-SC for pgsql-hackers@arkaria.postgresql.org; Wed, 05 Jul 2023 11:11:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1qH0Pm-0007Wn-FG for pgsql-hackers@arkaria.postgresql.org; Wed, 05 Jul 2023 11:11:18 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qH0Pm-0007Wd-4y for pgsql-hackers@lists.postgresql.org; Wed, 05 Jul 2023 11:11:18 +0000 Received: from mail-lf1-x135.google.com ([2a00:1450:4864:20::135]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qH0Pe-002KIz-2s for pgsql-hackers@lists.postgresql.org; Wed, 05 Jul 2023 11:11:16 +0000 Received: by mail-lf1-x135.google.com with SMTP id 2adb3069b0e04-4fa16c6a85cso10209330e87.3 for ; Wed, 05 Jul 2023 04:11:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1688555468; x=1691147468; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=zWBILQPiJuNHF1KD4Ws/9Im8ov/HewGGYf/oTHzPhLI=; b=mkKxqY0tLM2m55sGyY4m4F+XZB1ZGc055A07mXH+zxiztwwm8XiBuPFYSl8d8AYbup kZHp3p7fsxcI3xlC8jZHLu9v1ZJOgNNnNDY/ol+3eBi2NpVhVIi3KTIWLyjIKb1KmtYs hkUWpJnviiKw7JIaDOnJsYTuAHDDlByvJi5AmCCBktIK3e9nbCu5ONJjWNEJ0l3q/aXa PyNqSz/Q4ofb9629WDmvIoD9DD7pIcXEN8dap/snFLhcy6bx6JT2N2uqmfBZRPJNGNTz pLQGRcKTUTX7eHSsSPfI0vPxZFnWBAvBaDGpbdpeioPn47BLm/o/akA7m2tTaCTHDhe0 Z/iA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1688555468; x=1691147468; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=zWBILQPiJuNHF1KD4Ws/9Im8ov/HewGGYf/oTHzPhLI=; b=Eulzlp2GM6dAPdlBhwhhvuRlQrmyj+Y2/dGIQq3LEh0yihzx6FlsR/TFyepsP1GRmD Ux4dTXk932dVKQxIN1VRw+thCMEhk5x5IkVMZ80H1Q4rFvgqkpsk5yJ7ylYv2tLJ+WXN B9zE1weYna0VQtLQ599uLc/R6FPMVhjSkfJ/m8NUcFS3Z8Fj/EOyw/WDtDBTrl3IMLwh s7tHZ4ViNxnFCXVBUmuMUoVZFI/kTqFioZtR7gGCmJzEQqCVhbsRA4JZ4RRlUClhf5GC StoVJd6wAKU37FFeF3sA+9yoYAKQ8hz+RkEp7t1FK06OY+CyUaT0AWVjJOfNAotbAr3T JhTg== X-Gm-Message-State: ABy/qLY6EdWHNzTVXLDd6t1TMYepvtzjmbELKF7EYUUTLCkeFQcfeSi8 hDla9Dt+xc3bY3FZ9ptRNzRRaA== X-Google-Smtp-Source: APBJJlHdoVVepFUdrlGQ9+FlW0NAcOgx0d+DnQRVYiC0hWSZB7w8TvI2cQRcNHiiEBj9lb2RiN+GRA== X-Received: by 2002:ac2:4d9a:0:b0:4f9:b032:5361 with SMTP id g26-20020ac24d9a000000b004f9b0325361mr11549130lfe.10.1688555467744; Wed, 05 Jul 2023 04:11:07 -0700 (PDT) Received: from [10.137.0.17] (static-84-42-175-93.bb.vodafone.cz. [84.42.175.93]) by smtp.gmail.com with ESMTPSA id d10-20020a056402078a00b0051de38eb925sm7556819edy.93.2023.07.05.04.11.06 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 05 Jul 2023 04:11:07 -0700 (PDT) Message-ID: <254c4ca8-0644-f32c-d4ed-c4eed304054e@enterprisedb.com> Date: Wed, 5 Jul 2023 13:11:06 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: Parallel CREATE INDEX for BRIN indexes Content-Language: en-US To: Matthias van de Meent Cc: PostgreSQL Hackers References: From: Tomas Vondra In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 7/5/23 10:44, Matthias van de Meent wrote: > On Wed, 5 Jul 2023 at 00:08, Tomas Vondra wrote: >> >> >> >> On 7/4/23 23:53, Matthias van de Meent wrote: >>> On Thu, 8 Jun 2023 at 14:55, Tomas Vondra wrote: >>>> >>>> Hi, >>>> >>>> Here's a WIP patch allowing parallel CREATE INDEX for BRIN indexes. The >>>> infrastructure (starting workers etc.) is "inspired" by the BTREE code >>>> (i.e. copied from that and massaged a bit to call brin stuff). >>> >>> Nice work. >>> >>>> In both cases _brin_end_parallel then reads the summaries from worker >>>> files, and adds them into the index. In 0001 this is fairly simple, >>>> although we could do one more improvement and sort the ranges by range >>>> start to make the index nicer (and possibly a bit more efficient). This >>>> should be simple, because the per-worker results are already sorted like >>>> that (so a merge sort in _brin_end_parallel would be enough). >>> >>> I see that you manually built the passing and sorting of tuples >>> between workers, but can't we use the parallel tuplesort >>> infrastructure for that? It already has similar features in place and >>> improves code commonality. >>> >> >> Maybe. I wasn't that familiar with what parallel tuplesort can and can't >> do, and the little I knew I managed to forget since I wrote this patch. >> Which similar features do you have in mind? >> >> The workers are producing the results in "start_block" order, so if they >> pass that to the leader, it probably can do the usual merge sort. >> >>>> For 0002 it's a bit more complicated, because with a single parallel >>>> scan brinbuildCallbackParallel can't decide if a range is assigned to a >>>> different worker or empty. And we want to generate summaries for empty >>>> ranges in the index. We could either skip such range during index build, >>>> and then add empty summaries in _brin_end_parallel (if needed), or add >>>> them and then merge them using "union". >>>> >>>> >>>> I just realized there's a third option to do this - we could just do >>>> regular parallel scan (with no particular regard to pagesPerRange), and >>>> then do "union" when merging results from workers. It doesn't require >>>> the sequence of TID scans, and the union would also handle the empty >>>> ranges. The per-worker results might be much larger, though, because >>>> each worker might produce up to the "full" BRIN index. >>> >>> Would it be too much effort to add a 'min_chunk_size' argument to >>> table_beginscan_parallel (or ParallelTableScanDesc) that defines the >>> minimum granularity of block ranges to be assigned to each process? I >>> think that would be the most elegant solution that would require >>> relatively little effort: table_block_parallelscan_nextpage already >>> does parallel management of multiple chunk sizes, and I think this >>> modification would fit quite well in that code. >>> >> >> I'm confused. Isn't that pretty much exactly what 0002 does? I mean, >> that passes pagesPerRange to table_parallelscan_initialize(), so that >> each pagesPerRange is assigned to a single worker. > > Huh, I overlooked that one... Sorry for that. > >> The trouble I described above is that the scan returns tuples, and the >> consumer has no idea what was the chunk size or how many other workers >> are there. Imagine you get a tuple from block 1, and then a tuple from >> block 1000. Does that mean that the blocks in between are empty or that >> they were processed by some other worker? > > If the unit of work for parallel table scans is the index's > pages_per_range, then I think we can just fill in expected-but-missing > ranges as 'empty' in the parallel leader during index loading, like > the first of the two solutions you proposed. > Right, I think that's the right solution. Or rather the only solution, because the other idea (generating the empty ranges in workers) relies on the workers knowing when to generate that. But I don't think the workers have the necessary information. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company