From 4ea51cdfe85ceef8afabceb03c446574daa0ac23 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 19 Jan 2015 15:20:31 -0500 Subject: Use abbreviated keys for faster sorting of text datums. This commit extends the SortSupport infrastructure to allow operator classes the option to provide abbreviated representations of Datums; in the case of text, we abbreviate by taking the first few characters of the strxfrm() blob. If the abbreviated comparison is insufficent to resolve the comparison, we fall back on the normal comparator. This can be much faster than the old way of doing sorting if the first few bytes of the string are usually sufficient to resolve the comparison. There is the potential for a performance regression if all of the strings to be sorted are identical for the first 8+ characters and differ only in later positions; therefore, the SortSupport machinery now provides an infrastructure to abort the use of abbreviation if it appears that abbreviation is producing comparatively few distinct keys. HyperLogLog, a streaming cardinality estimator, is included in this commit and used to make that determination for text. Peter Geoghegan, reviewed by me. --- src/backend/executor/nodeMergeAppend.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/backend/executor/nodeMergeAppend.c') diff --git a/src/backend/executor/nodeMergeAppend.c b/src/backend/executor/nodeMergeAppend.c index 4e200a8e346..0c814f0e72d 100644 --- a/src/backend/executor/nodeMergeAppend.c +++ b/src/backend/executor/nodeMergeAppend.c @@ -137,6 +137,15 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags) sortKey->ssup_nulls_first = node->nullsFirst[i]; sortKey->ssup_attno = node->sortColIdx[i]; + /* + * It isn't feasible to perform abbreviated key conversion, since + * tuples are pulled into mergestate's binary heap as needed. It would + * likely be counter-productive to convert tuples into an abbreviated + * representation as they're pulled up, so opt out of that additional + * optimization entirely. + */ + sortKey->abbreviate = false; + PrepareSortSupportFromOrderingOp(node->sortOperators[i], sortKey); } -- cgit v1.2.3