@@ -19,21 +19,23 @@ ui64 TSpecialReadContext::GetMemoryForSources(const std::map<ui32, std::shared_p
19
19
20
20
std::shared_ptr<NKikimr::NOlap::NPlainReader::IFetchingStep> TSpecialReadContext::GetColumnsFetchingPlan (const std::shared_ptr<IDataSource>& source, const bool exclusiveSource) const {
21
21
const bool needSnapshots = !exclusiveSource || ReadMetadata->GetSnapshot () < source->GetRecordSnapshotMax ();
22
- auto result = CacheFetchingScripts[needSnapshots ? 1 : 0 ][exclusiveSource ? 1 : 0 ];
22
+ const bool partialUsageByPK = ReadMetadata->GetPKRangesFilter ().IsPortionInPartialUsage (source->GetStartReplaceKey (), source->GetFinishReplaceKey (), ReadMetadata->GetIndexInfo ());
23
+ auto result = CacheFetchingScripts[needSnapshots ? 1 : 0 ][exclusiveSource ? 1 : 0 ][partialUsageByPK ? 1 : 0 ];
23
24
if (!result) {
24
25
return std::make_shared<TBuildFakeSpec>(source->GetRecordsCount (), " fake" );
25
26
}
26
27
return result;
27
28
}
28
29
29
- std::shared_ptr<NKikimr::NOlap::NPlainReader::IFetchingStep> TSpecialReadContext::BuildColumnsFetchingPlan (const bool needSnapshots, const bool exclusiveSource) const {
30
+ std::shared_ptr<NKikimr::NOlap::NPlainReader::IFetchingStep> TSpecialReadContext::BuildColumnsFetchingPlan (const bool needSnapshots, const bool exclusiveSource, const bool partialUsageByPredicateExt ) const {
30
31
std::shared_ptr<IFetchingStep> result = std::make_shared<TFakeStep>();
31
32
std::shared_ptr<IFetchingStep> current = result;
33
+ const bool partialUsageByPredicate = partialUsageByPredicateExt && PredicateColumns->GetColumnsCount ();
32
34
if (!!IndexChecker) {
33
35
current = current->AttachNext (std::make_shared<TBlobsFetchingStep>(std::make_shared<TIndexesSet>(IndexChecker->GetIndexIds ())));
34
36
current = current->AttachNext (std::make_shared<TApplyIndexStep>(IndexChecker));
35
37
}
36
- if (!EFColumns->GetColumnsCount ()) {
38
+ if (!EFColumns->GetColumnsCount () && !partialUsageByPredicate ) {
37
39
TColumnsSet columnsFetch = *FFColumns;
38
40
if (needSnapshots) {
39
41
columnsFetch = columnsFetch + *SpecColumns;
@@ -52,6 +54,9 @@ std::shared_ptr<NKikimr::NOlap::NPlainReader::IFetchingStep> TSpecialReadContext
52
54
if (needSnapshots || FFColumns->Contains (SpecColumns)) {
53
55
columnsFetch = columnsFetch + *SpecColumns;
54
56
}
57
+ if (partialUsageByPredicate) {
58
+ columnsFetch = columnsFetch + *PredicateColumns;
59
+ }
55
60
AFL_VERIFY (columnsFetch.GetColumnsCount ());
56
61
current = current->AttachNext (std::make_shared<TBlobsFetchingStep>(std::make_shared<TColumnsSet>(columnsFetch), " ef" ));
57
62
@@ -60,17 +65,21 @@ std::shared_ptr<NKikimr::NOlap::NPlainReader::IFetchingStep> TSpecialReadContext
60
65
current = current->AttachNext (std::make_shared<TSnapshotFilter>());
61
66
columnsFetch = columnsFetch - *SpecColumns;
62
67
}
63
- current = current-> AttachNext (std::make_shared<TAssemblerStep>(std::make_shared<TColumnsSet>(columnsFetch)));
64
- if (!ReadMetadata-> GetPKRangesFilter (). IsEmpty ()) {
68
+ if (partialUsageByPredicate) {
69
+ current = current-> AttachNext (std::make_shared<TAssemblerStep>(PredicateColumns));
65
70
current = current->AttachNext (std::make_shared<TPredicateFilter>());
71
+ columnsFetch = columnsFetch - *PredicateColumns;
72
+ }
73
+ if (columnsFetch.GetColumnsCount ()) {
74
+ current = current->AttachNext (std::make_shared<TAssemblerStep>(std::make_shared<TColumnsSet>(columnsFetch)));
66
75
}
67
76
for (auto && i : ReadMetadata->GetProgram ().GetSteps ()) {
68
77
if (!i->IsFilterOnly ()) {
69
78
break ;
70
79
}
71
80
current = current->AttachNext (std::make_shared<TFilterProgramStep>(i));
72
81
}
73
- const TColumnsSet columnsAdditionalFetch = *FFColumns - *EFColumns - *SpecColumns;
82
+ const TColumnsSet columnsAdditionalFetch = *FFColumns - *EFColumns - *SpecColumns - *PredicateColumns ;
74
83
if (columnsAdditionalFetch.GetColumnsCount ()) {
75
84
current = current->AttachNext (std::make_shared<TBlobsFetchingStep>(std::make_shared<TColumnsSet>(columnsAdditionalFetch)));
76
85
current = current->AttachNext (std::make_shared<TAssemblerStep>(std::make_shared<TColumnsSet>(columnsAdditionalFetch)));
@@ -84,7 +93,7 @@ std::shared_ptr<NKikimr::NOlap::NPlainReader::IFetchingStep> TSpecialReadContext
84
93
current = current->AttachNext (std::make_shared<TSnapshotFilter>());
85
94
}
86
95
current = current->AttachNext (std::make_shared<TAssemblerStep>(PKColumns));
87
- if (!ReadMetadata-> GetPKRangesFilter (). IsEmpty () ) {
96
+ if (partialUsageByPredicate ) {
88
97
current = current->AttachNext (std::make_shared<TPredicateFilter>());
89
98
}
90
99
const TColumnsSet columnsFetchEF = columnsFetch - *SpecColumns - *PKColumns;
@@ -95,7 +104,7 @@ std::shared_ptr<NKikimr::NOlap::NPlainReader::IFetchingStep> TSpecialReadContext
95
104
}
96
105
current = current->AttachNext (std::make_shared<TFilterProgramStep>(i));
97
106
}
98
- const TColumnsSet columnsAdditionalFetch = *FFColumns - *EFColumns - *SpecColumns - *PKColumns;
107
+ const TColumnsSet columnsAdditionalFetch = *FFColumns - *EFColumns - *SpecColumns - *PKColumns - *PredicateColumns ;
99
108
if (columnsAdditionalFetch.GetColumnsCount ()) {
100
109
current = current->AttachNext (std::make_shared<TBlobsFetchingStep>(std::make_shared<TColumnsSet>(columnsAdditionalFetch)));
101
110
current = current->AttachNext (std::make_shared<TAssemblerStep>(std::make_shared<TColumnsSet>(columnsAdditionalFetch)));
@@ -114,6 +123,14 @@ TSpecialReadContext::TSpecialReadContext(const std::shared_ptr<TReadContext>& co
114
123
auto readSchema = ReadMetadata->GetLoadSchema (ReadMetadata->GetSnapshot ());
115
124
SpecColumns = std::make_shared<TColumnsSet>(TIndexInfo::GetSpecialColumnIdsSet (), ReadMetadata->GetIndexInfo (), readSchema);
116
125
IndexChecker = ReadMetadata->GetProgram ().GetIndexChecker ();
126
+ {
127
+ auto predicateColumns = ReadMetadata->GetPKRangesFilter ().GetColumnIds (ReadMetadata->GetIndexInfo ());
128
+ if (predicateColumns.size ()) {
129
+ PredicateColumns = std::make_shared<TColumnsSet>(predicateColumns, ReadMetadata->GetIndexInfo (), readSchema);
130
+ } else {
131
+ PredicateColumns = std::make_shared<TColumnsSet>();
132
+ }
133
+ }
117
134
{
118
135
auto efColumns = ReadMetadata->GetEarlyFilterColumnIds ();
119
136
if (efColumns.size ()) {
@@ -144,10 +161,14 @@ TSpecialReadContext::TSpecialReadContext(const std::shared_ptr<TReadContext>& co
144
161
MergeColumns = std::make_shared<TColumnsSet>(*PKColumns + *SpecColumns);
145
162
146
163
AFL_DEBUG (NKikimrServices::TX_COLUMNSHARD_SCAN)(" columns_context_info" , DebugString ());
147
- CacheFetchingScripts[0 ][0 ] = BuildColumnsFetchingPlan (false , false );
148
- CacheFetchingScripts[0 ][1 ] = BuildColumnsFetchingPlan (false , true );
149
- CacheFetchingScripts[1 ][0 ] = BuildColumnsFetchingPlan (true , false );
150
- CacheFetchingScripts[1 ][1 ] = BuildColumnsFetchingPlan (true , true );
164
+ CacheFetchingScripts[0 ][0 ][0 ] = BuildColumnsFetchingPlan (false , false , false );
165
+ CacheFetchingScripts[0 ][1 ][0 ] = BuildColumnsFetchingPlan (false , true , false );
166
+ CacheFetchingScripts[1 ][0 ][0 ] = BuildColumnsFetchingPlan (true , false , false );
167
+ CacheFetchingScripts[1 ][1 ][0 ] = BuildColumnsFetchingPlan (true , true , false );
168
+ CacheFetchingScripts[0 ][0 ][1 ] = BuildColumnsFetchingPlan (false , false , true );
169
+ CacheFetchingScripts[0 ][1 ][1 ] = BuildColumnsFetchingPlan (false , true , true );
170
+ CacheFetchingScripts[1 ][0 ][1 ] = BuildColumnsFetchingPlan (true , false , true );
171
+ CacheFetchingScripts[1 ][1 ][1 ] = BuildColumnsFetchingPlan (true , true , true );
151
172
}
152
173
153
174
}
0 commit comments