提交 ca094f38 编写于 作者: A Asim Praveen

Avoid loading of block directory entries for columns that are not projected.

This change applies only to column oriented tables (CO).  It reads
block directory entries for only those columns that appear in project
list (e.g. select clause).

Closes #369
上级 1400d4c9
......@@ -1233,7 +1233,8 @@ aocs_fetch_init(Relation relation,
aocsFetchDesc->totalSegfiles,
aocsFetchDesc->relation,
relation->rd_att->natts,
true);
true,
proj);
Assert(relation->rd_att != NULL);
......
......@@ -2235,7 +2235,8 @@ appendonly_fetch_init(
aoFetchDesc->totalSegfiles,
aoFetchDesc->relation,
1,
false);
false,
NULL);
AppendOnlyVisimap_Init(&aoFetchDesc->visibilityMap,
aoentry->visimaprelid,
......
......@@ -141,8 +141,13 @@ init_internal(AppendOnlyBlockDirectory *blockDirectory)
palloc0(sizeof(MinipagePerColumnGroup) * blockDirectory->numColumnGroups);
for (groupNo = 0; groupNo < blockDirectory->numColumnGroups; groupNo++)
{
MinipagePerColumnGroup *minipageInfo = &blockDirectory->minipages[groupNo];
if (blockDirectory->proj && !blockDirectory->proj[groupNo])
{
/* Ignore columns that are not projected. */
continue;
}
MinipagePerColumnGroup *minipageInfo =
&blockDirectory->minipages[groupNo];
minipageInfo->minipage =
palloc0(minipage_size(NUM_MINIPAGE_ENTRIES));
minipageInfo->numMinipageEntries = 0;
......@@ -169,8 +174,9 @@ AppendOnlyBlockDirectory_Init_forSearch(
int totalSegfiles,
Relation aoRel,
int numColumnGroups,
bool isAOCol)
{
bool isAOCol,
bool *proj)
{
Assert(aoEntry != NULL);
blockDirectory->aoRel = aoRel;
......@@ -196,6 +202,7 @@ AppendOnlyBlockDirectory_Init_forSearch(
blockDirectory->appendOnlyMetaDataSnapshot = appendOnlyMetaDataSnapshot;
blockDirectory->numColumnGroups = numColumnGroups;
blockDirectory->isAOCol = isAOCol;
blockDirectory->proj = proj;
blockDirectory->currentSegmentFileNum = -1;
Assert(OidIsValid(aoEntry->blkdirrelid));
......@@ -255,7 +262,8 @@ AppendOnlyBlockDirectory_Init_forInsert(
blockDirectory->currentSegmentFileNum = segno;
blockDirectory->numColumnGroups = numColumnGroups;
blockDirectory->isAOCol = isAOCol;
blockDirectory->proj = NULL;
Assert(OidIsValid(aoEntry->blkdirrelid));
blockDirectory->blkdirRel =
......@@ -319,7 +327,8 @@ AppendOnlyBlockDirectory_Init_addCol(
blockDirectory->currentSegmentFileNum = segno;
blockDirectory->numColumnGroups = numColumnGroups;
blockDirectory->isAOCol = isAOCol;
blockDirectory->proj = NULL;
Assert(OidIsValid(aoEntry->blkdirrelid));
/*
......@@ -560,6 +569,11 @@ AppendOnlyBlockDirectory_GetEntry(
for (tmpGroupNo = 0; tmpGroupNo < blockDirectory->numColumnGroups; tmpGroupNo++)
{
if (blockDirectory->proj && !blockDirectory->proj[tmpGroupNo])
{
/* Ignore columns that are not projected. */
continue;
}
/* Setup the scan keys for the scan. */
Assert(scanKeys != NULL);
scanKeys[0].sk_argument = Int32GetDatum(segmentFileNum);
......@@ -1258,7 +1272,8 @@ AppendOnlyBlockDirectory_End_forSearch(
for (groupNo = 0; groupNo < blockDirectory->numColumnGroups; groupNo++)
{
pfree(blockDirectory->minipages[groupNo].minipage);
if (blockDirectory->minipages[groupNo].minipage != NULL)
pfree(blockDirectory->minipages[groupNo].minipage);
}
ereportif(Debug_appendonly_print_blockdirectory, LOG,
......
......@@ -2143,7 +2143,8 @@ vacuum_appendonly_indexes(Relation aoRelation,
totalSegfiles,
aoRelation,
1,
RelationIsAoCols(aoRelation));
RelationIsAoCols(aoRelation),
NULL);
/* Clean/scan index relation(s) */
if (Irel != NULL)
......
......@@ -90,7 +90,8 @@ typedef struct AppendOnlyBlockDirectory
Relation blkdirIdx;
int numColumnGroups;
bool isAOCol;
bool *proj; /* projected columns, used only if isAOCol = TRUE */
MemoryContext memoryContext;
int totalSegfiles;
......@@ -182,7 +183,8 @@ extern void AppendOnlyBlockDirectory_Init_forSearch(
int totalSegfiles,
Relation aoRel,
int numColumnGroups,
bool isAOCol);
bool isAOCol,
bool *proj);
extern void AppendOnlyBlockDirectory_Init_addCol(
AppendOnlyBlockDirectory *blockDirectory,
AppendOnlyEntry *aoEntry,
......
......@@ -283,7 +283,11 @@ select * from co where j = 2;
insert into co values (9,2,'b'), (10,2,'bb'), (11,2,'bbb'), (12,2,'bbbb'),
(13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa');
select * from co where j = 2;
-- Select specific columns. This covers the case when block directory
-- entries for only specific columns need to be loaded during index
-- scan.
select i from co where j = 2;
select j,i from co where k = 'aaa' or k = 'bbb';
---------------------
-- UAO
......
......@@ -544,6 +544,28 @@ select * from co where j = 2;
11 | 2 | bbb
(6 rows)
-- Select specific columns. This covers the case when block directory
-- entries for only specific columns need to be loaded during index
-- scan.
select i from co where j = 2;
i
----
9
11
2
10
10
12
(6 rows)
select j,i from co where k = 'aaa' or k = 'bbb';
j | i
---+----
3 | 3
3 | 11
2 | 11
(3 rows)
---------------------
-- UAO
---------------------
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册