Re: Parallel CREATE INDEX for BRIN indexes
От | Tomas Vondra |
---|---|
Тема | Re: Parallel CREATE INDEX for BRIN indexes |
Дата | |
Msg-id | 9a646c51-a4c3-ce34-cccd-99d00fd1dc6a@enterprisedb.com обсуждение исходный текст |
Ответ на | Re: Parallel CREATE INDEX for BRIN indexes (Matthias van de Meent <boekewurm+postgres@gmail.com>) |
Ответы |
Re: Parallel CREATE INDEX for BRIN indexes
|
Список | pgsql-hackers |
On 11/28/23 16:39, Matthias van de Meent wrote: > On Thu, 23 Nov 2023 at 14:35, Tomas Vondra > <tomas.vondra@enterprisedb.com> wrote: >> On 11/23/23 13:33, Matthias van de Meent wrote: >>> The union operator may leak (lots of) memory, so I think it makes >>> sense to keep a context around that can be reset after we've extracted >>> the merge result. >>> >> >> But does the current code actually achieve that? It does create a "brin >> union" context, but then it only does this: >> >> /* Use our own memory context to avoid retail pfree */ >> cxt = AllocSetContextCreate(CurrentMemoryContext, >> "brin union", >> ALLOCSET_DEFAULT_SIZES); >> oldcxt = MemoryContextSwitchTo(cxt); >> db = brin_deform_tuple(bdesc, b, NULL); >> MemoryContextSwitchTo(oldcxt); >> >> Surely that does not limit the amount of memory used by the actual union >> functions in any way? > > Oh, yes, of course. For some reason I thought that covered the calls > to the union operator function too, but it indeed only covers > deserialization. I do think it is still worthwhile to not do the > create/delete cycle, but won't hold the patch back for that. > I think the union_tuples() changes are better left for a separate patch. >>>> However, I don't think the number of union_tuples calls is likely to be >>>> very high, especially for large tables. Because we split the table into >>>> 2048 chunks, and then cap the chunk size by 8192. For large tables >>>> (where this matters) we're likely close to 8192. >>> >>> I agree that the merging part of the index creation is the last part, >>> and usually has no high impact on the total performance of the reindex >>> operation, but in memory-constrained environments releasing and then >>> requesting the same chunk of memory over and over again just isn't >>> great. >> >> OK, I'll take a look at the scratch context you suggested. >> >> My point however was we won't actually do that very often, because on >> large tables the BRIN ranges are likely smaller than the parallel scan >> chunk size, so few overlaps. OTOH if the table is small, or if the BRIN >> ranges are large, there'll be few of them. > > That's true, so maybe I'm concerned about something that amounts to > only marginal gains. > However, after thinking about this a bit more, I think we actually do need to do something about the memory management when merging tuples. AFAIK the general assumption was that union_tuple() only runs for a single range, and then the whole context gets freed. But the way the merging was implemented, it all runs in a single context. And while a single union_tuple() may not need a lot memory, in total it may be annoying. I just added a palloc(1MB) into union_tuples and ended up with ~160MB allocated in the PortalContext on just 2GB table. In practice the memory will grow more slowly, but not great :-/ The attached 0003 patch adds a memory context that's reset after producing a merged BRIN tuple for each page range. > I noticed that the v4 patch doesn't yet update the documentation in > indexam.sgml with am->amcanbuildparallel. Should be fixed by 0002. I decided to add a simple note to ambuild(), not sure if something more is needed. > Once that is included and reviewed I think this will be ready, unless > you want to address any of my comments upthread (that I marked with > 'not in this patch') in this patch. > Thanks. I believe the attached version addresses it. There's also 0004 with some indentation tweaks per pgindent. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Вложения
В списке pgsql-hackers по дате отправления: