提交 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, ...@@ -1233,7 +1233,8 @@ aocs_fetch_init(Relation relation,
aocsFetchDesc->totalSegfiles, aocsFetchDesc->totalSegfiles,
aocsFetchDesc->relation, aocsFetchDesc->relation,
relation->rd_att->natts, relation->rd_att->natts,
true); true,
proj);
Assert(relation->rd_att != NULL); Assert(relation->rd_att != NULL);
......
...@@ -2235,7 +2235,8 @@ appendonly_fetch_init( ...@@ -2235,7 +2235,8 @@ appendonly_fetch_init(
aoFetchDesc->totalSegfiles, aoFetchDesc->totalSegfiles,
aoFetchDesc->relation, aoFetchDesc->relation,
1, 1,
false); false,
NULL);
AppendOnlyVisimap_Init(&aoFetchDesc->visibilityMap, AppendOnlyVisimap_Init(&aoFetchDesc->visibilityMap,
aoentry->visimaprelid, aoentry->visimaprelid,
......
...@@ -141,8 +141,13 @@ init_internal(AppendOnlyBlockDirectory *blockDirectory) ...@@ -141,8 +141,13 @@ init_internal(AppendOnlyBlockDirectory *blockDirectory)
palloc0(sizeof(MinipagePerColumnGroup) * blockDirectory->numColumnGroups); palloc0(sizeof(MinipagePerColumnGroup) * blockDirectory->numColumnGroups);
for (groupNo = 0; groupNo < blockDirectory->numColumnGroups; groupNo++) 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 = minipageInfo->minipage =
palloc0(minipage_size(NUM_MINIPAGE_ENTRIES)); palloc0(minipage_size(NUM_MINIPAGE_ENTRIES));
minipageInfo->numMinipageEntries = 0; minipageInfo->numMinipageEntries = 0;
...@@ -169,8 +174,9 @@ AppendOnlyBlockDirectory_Init_forSearch( ...@@ -169,8 +174,9 @@ AppendOnlyBlockDirectory_Init_forSearch(
int totalSegfiles, int totalSegfiles,
Relation aoRel, Relation aoRel,
int numColumnGroups, int numColumnGroups,
bool isAOCol) bool isAOCol,
{ bool *proj)
{
Assert(aoEntry != NULL); Assert(aoEntry != NULL);
blockDirectory->aoRel = aoRel; blockDirectory->aoRel = aoRel;
...@@ -196,6 +202,7 @@ AppendOnlyBlockDirectory_Init_forSearch( ...@@ -196,6 +202,7 @@ AppendOnlyBlockDirectory_Init_forSearch(
blockDirectory->appendOnlyMetaDataSnapshot = appendOnlyMetaDataSnapshot; blockDirectory->appendOnlyMetaDataSnapshot = appendOnlyMetaDataSnapshot;
blockDirectory->numColumnGroups = numColumnGroups; blockDirectory->numColumnGroups = numColumnGroups;
blockDirectory->isAOCol = isAOCol; blockDirectory->isAOCol = isAOCol;
blockDirectory->proj = proj;
blockDirectory->currentSegmentFileNum = -1; blockDirectory->currentSegmentFileNum = -1;
Assert(OidIsValid(aoEntry->blkdirrelid)); Assert(OidIsValid(aoEntry->blkdirrelid));
...@@ -255,7 +262,8 @@ AppendOnlyBlockDirectory_Init_forInsert( ...@@ -255,7 +262,8 @@ AppendOnlyBlockDirectory_Init_forInsert(
blockDirectory->currentSegmentFileNum = segno; blockDirectory->currentSegmentFileNum = segno;
blockDirectory->numColumnGroups = numColumnGroups; blockDirectory->numColumnGroups = numColumnGroups;
blockDirectory->isAOCol = isAOCol; blockDirectory->isAOCol = isAOCol;
blockDirectory->proj = NULL;
Assert(OidIsValid(aoEntry->blkdirrelid)); Assert(OidIsValid(aoEntry->blkdirrelid));
blockDirectory->blkdirRel = blockDirectory->blkdirRel =
...@@ -319,7 +327,8 @@ AppendOnlyBlockDirectory_Init_addCol( ...@@ -319,7 +327,8 @@ AppendOnlyBlockDirectory_Init_addCol(
blockDirectory->currentSegmentFileNum = segno; blockDirectory->currentSegmentFileNum = segno;
blockDirectory->numColumnGroups = numColumnGroups; blockDirectory->numColumnGroups = numColumnGroups;
blockDirectory->isAOCol = isAOCol; blockDirectory->isAOCol = isAOCol;
blockDirectory->proj = NULL;
Assert(OidIsValid(aoEntry->blkdirrelid)); Assert(OidIsValid(aoEntry->blkdirrelid));
/* /*
...@@ -560,6 +569,11 @@ AppendOnlyBlockDirectory_GetEntry( ...@@ -560,6 +569,11 @@ AppendOnlyBlockDirectory_GetEntry(
for (tmpGroupNo = 0; tmpGroupNo < blockDirectory->numColumnGroups; tmpGroupNo++) 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. */ /* Setup the scan keys for the scan. */
Assert(scanKeys != NULL); Assert(scanKeys != NULL);
scanKeys[0].sk_argument = Int32GetDatum(segmentFileNum); scanKeys[0].sk_argument = Int32GetDatum(segmentFileNum);
...@@ -1258,7 +1272,8 @@ AppendOnlyBlockDirectory_End_forSearch( ...@@ -1258,7 +1272,8 @@ AppendOnlyBlockDirectory_End_forSearch(
for (groupNo = 0; groupNo < blockDirectory->numColumnGroups; groupNo++) 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, ereportif(Debug_appendonly_print_blockdirectory, LOG,
......
...@@ -2143,7 +2143,8 @@ vacuum_appendonly_indexes(Relation aoRelation, ...@@ -2143,7 +2143,8 @@ vacuum_appendonly_indexes(Relation aoRelation,
totalSegfiles, totalSegfiles,
aoRelation, aoRelation,
1, 1,
RelationIsAoCols(aoRelation)); RelationIsAoCols(aoRelation),
NULL);
/* Clean/scan index relation(s) */ /* Clean/scan index relation(s) */
if (Irel != NULL) if (Irel != NULL)
......
...@@ -90,7 +90,8 @@ typedef struct AppendOnlyBlockDirectory ...@@ -90,7 +90,8 @@ typedef struct AppendOnlyBlockDirectory
Relation blkdirIdx; Relation blkdirIdx;
int numColumnGroups; int numColumnGroups;
bool isAOCol; bool isAOCol;
bool *proj; /* projected columns, used only if isAOCol = TRUE */
MemoryContext memoryContext; MemoryContext memoryContext;
int totalSegfiles; int totalSegfiles;
...@@ -182,7 +183,8 @@ extern void AppendOnlyBlockDirectory_Init_forSearch( ...@@ -182,7 +183,8 @@ extern void AppendOnlyBlockDirectory_Init_forSearch(
int totalSegfiles, int totalSegfiles,
Relation aoRel, Relation aoRel,
int numColumnGroups, int numColumnGroups,
bool isAOCol); bool isAOCol,
bool *proj);
extern void AppendOnlyBlockDirectory_Init_addCol( extern void AppendOnlyBlockDirectory_Init_addCol(
AppendOnlyBlockDirectory *blockDirectory, AppendOnlyBlockDirectory *blockDirectory,
AppendOnlyEntry *aoEntry, AppendOnlyEntry *aoEntry,
......
...@@ -283,7 +283,11 @@ select * from co where j = 2; ...@@ -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'), 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'); (13,5,'aaaaa'), (14,6,'aaaaaa'), (15,7,'aaaaaaa'), (16,8,'aaaaaaaa');
select * from co where j = 2; 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 -- UAO
......
...@@ -544,6 +544,28 @@ select * from co where j = 2; ...@@ -544,6 +544,28 @@ select * from co where j = 2;
11 | 2 | bbb 11 | 2 | bbb
(6 rows) (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 -- UAO
--------------------- ---------------------
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册