Re: [HACKERS] path toward faster partition pruning
От | David Rowley |
---|---|
Тема | Re: [HACKERS] path toward faster partition pruning |
Дата | |
Msg-id | CAKJS1f8PBtPoKp9njpF0zKdHuQ7vDmLzBfjbN4BYs6Q7QKqA8Q@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: [HACKERS] path toward faster partition pruning (Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>) |
Ответы |
Re: [HACKERS] path toward faster partition pruning
(David Rowley <david.rowley@2ndquadrant.com>)
Re: [Sender Address Forgery]Re: [HACKERS] path toward fasterpartition pruning (Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>) |
Список | pgsql-hackers |
On 31 October 2017 at 21:43, Amit Langote <Langote_Amit_f8@lab.ntt.co.jp> wrote: > Attached updated version of the patches addressing some of your comments I've spent a bit of time looking at these but I'm out of time for now. So far I have noted down the following; 1. This comment seem wrong. /* * Since the clauses in rel->baserestrictinfo should all contain Const * operands, it should be possible to prune partitions right away. */ How about PARTITION BY RANGE (a) and SELECT * FROM parttable WHERE a > b; ? baserestrictinfo in this case will contain a single RestrictInfo with an OpExpr containing two Var args and it'll come right through that function too. 2. This code is way more complex than it needs to be. if (num_parts > 0) { int j; all_indexes = (int *) palloc(num_parts * sizeof(int)); j = 0; if (min_part_idx >= 0 && max_part_idx >= 0) { for (i = min_part_idx; i <= max_part_idx; i++) all_indexes[j++] = i; } if (!bms_is_empty(other_parts)) while ((i = bms_first_member(other_parts)) >= 0) all_indexes[j++] = i; if (j > 1) qsort((void *) all_indexes, j, sizeof(int), intcmp); } It looks like the min/max partition stuff is just complicating things here. If you need to build this array of all_indexes[] anyway, I don't quite understand the point of the min/max. It seems like min/max would probably work a bit nicer if you didn't need the other_parts BitmapSet, so I recommend just getting rid of min/max completely and just have a BitmapSet with bit set for each partition's index you need, you'd not need to go to the trouble of performing a qsort on an array and you could get rid of quite a chunk of code too. The entire function would then not be much more complex than: partindexes = get_partitions_from_clauses(parent, partclauses); while ((i = bms_first_member(partindexes)) >= 0) { AppendRelInfo *appinfo = rel->part_appinfos[i]; result = lappend(result, appinfo); } Then you can also get rid of your intcmp() function too. 3. Following code has the wrong size calculation: memset(keynullness, -1, PARTITION_MAX_KEYS * sizeof(NullTestType *)); should be PARTITION_MAX_KEYS * sizeof(NullTestType). It might have worked on your machine if you're compiling as 32 bit. I'll continue on with the review in the next few days. -- David Rowley http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
В списке pgsql-hackers по дате отправления: