On Fri, Jun 23, 2023 at 2:21 AM Matthias van de Meent <boekewurm+postg...@gmail.com> wrote: >
> == Dynamic prefix truncation (0001) > The code now tracks how many prefix attributes of the scan key are > already considered equal based on earlier binsrch results, and ignores > those prefix colums in further binsrch operations (sorted list; if > both the high and low value of your range have the same prefix, the > middle value will have that prefix, too). This reduces the number of > calls into opclass-supplied (dynamic) compare functions, and thus > increase performance for multi-key-attribute indexes where shared > prefixes are common (e.g. index on (customer, order_id)). I think the idea looks good to me. I was looking into the 0001 patches, and I have one confusion in the below hunk in the _bt_moveright function, basically, if the parent page's right key is exactly matching the HIGH key of the child key then I suppose while doing the "_bt_compare" with the HIGH_KEY we can use the optimization right, i.e. column number from where we need to start the comparison should be used what is passed by the caller. But in the below hunk, you are always passing that as 'cmpcol' which is 1. I think this should be '*comparecol' because '*comparecol' will either hold the value passed by the parent if high key data exactly match with the parent's right tuple or it will hold 1 in case it doesn't match. Am I missing something? @@ -247,13 +256,16 @@ _bt_moveright(Relation rel, { .... + if (P_IGNORE(opaque) || + _bt_compare(rel, key, page, P_HIKEY, &cmpcol) >= cmpval) + { + *comparecol = 1; } -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com