aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/gin/ginget.c
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-01-29 18:23:17 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-01-29 18:26:40 +0200
commit25b1dafab63f465a65c63b26834dc18857f0fa0c (patch)
treeb442a77b6e24d9c6ad176fa9d70497c597d5ce41 /src/backend/access/gin/ginget.c
parente20c70cb0fa74d5bffa080e21a99b44bf0768667 (diff)
downloadpostgresql-25b1dafab63f465a65c63b26834dc18857f0fa0c.tar.gz
postgresql-25b1dafab63f465a65c63b26834dc18857f0fa0c.zip
Further optimize multi-key GIN searches.
If we're skipping past a certain TID, avoid decoding posting list segments that only contain smaller TIDs. Extracted from Alexander Korotkov's fast scan patch, heavily modified.
Diffstat (limited to 'src/backend/access/gin/ginget.c')
-rw-r--r--src/backend/access/gin/ginget.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index 40abb3971e2..49e47c6859c 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -400,6 +400,7 @@ restartScanEntry:
BlockNumber rootPostingTree = GinGetPostingTree(itup);
GinBtreeStack *stack;
Page page;
+ ItemPointerData minItem;
/*
* We should unlock entry page before touching posting tree to
@@ -426,7 +427,8 @@ restartScanEntry:
/*
* Load the first page into memory.
*/
- entry->list = GinDataLeafPageGetItems(page, &entry->nlist);
+ ItemPointerSetMin(&minItem);
+ entry->list = GinDataLeafPageGetItems(page, &entry->nlist, minItem);
entry->predictNumberResult = stack->predictNumber * entry->nlist;
@@ -558,7 +560,7 @@ entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, ItemPointerData advan
continue;
}
- entry->list = GinDataLeafPageGetItems(page, &entry->nlist);
+ entry->list = GinDataLeafPageGetItems(page, &entry->nlist, advancePast);
for (i = 0; i < entry->nlist; i++)
{