Skip to content

Commit 8a5e1e3

Browse files
authored
feat: add AstMemoryEstimator for SQL AST memory estimation (apache#16882)
1 parent 9b3bdc4 commit 8a5e1e3

File tree

222 files changed

+3722
-77
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

222 files changed

+3722
-77
lines changed

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/session/PrepareTask.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
2727
import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
2828
import org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
29-
import org.apache.iotdb.db.queryengine.plan.relational.sql.AstMemoryEstimator;
3029
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement;
3130
import org.apache.iotdb.rpc.TSStatusCode;
3231

@@ -69,7 +68,7 @@ public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor configTask
6968
}
7069

7170
// Estimate memory size of the AST
72-
long memorySizeInBytes = AstMemoryEstimator.estimateMemorySize(sql);
71+
long memorySizeInBytes = sql == null ? 0L : sql.ramBytesUsed();
7372

7473
// Allocate memory from CoordinatorMemoryManager
7574
// This memory is shared across all sessions using a single MemoryBlock

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/AstMemoryEstimator.java

Lines changed: 0 additions & 67 deletions
This file was deleted.

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractQueryDeviceWithCache.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
3232

3333
import org.apache.tsfile.read.common.block.TsBlock;
34+
import org.apache.tsfile.utils.RamUsageEstimator;
3435

3536
import java.util.ArrayList;
3637
import java.util.HashMap;
@@ -42,6 +43,9 @@
4243

4344
public abstract class AbstractQueryDeviceWithCache extends AbstractTraverseDevice {
4445

46+
private static final long INSTANCE_SIZE =
47+
RamUsageEstimator.shallowSizeOfInstance(AbstractQueryDeviceWithCache.class);
48+
4549
// For query devices fully in cache
4650
protected List<ShowDevicesResult> results = new ArrayList<>();
4751

@@ -111,4 +115,21 @@ public static List<ColumnHeader> getDeviceColumnHeaderList(
111115
public abstract DatasetHeader getDataSetHeader();
112116

113117
public abstract TsBlock getTsBlock(final Analysis analysis);
118+
119+
@Override
120+
public long ramBytesUsed() {
121+
return INSTANCE_SIZE + ramBytesUsedForCommonFields();
122+
}
123+
124+
@Override
125+
protected long ramBytesUsedForCommonFields() {
126+
long size = super.ramBytesUsedForCommonFields();
127+
if (results != null) {
128+
size += RamUsageEstimator.shallowSizeOf(results);
129+
for (ShowDevicesResult result : results) {
130+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(result);
131+
}
132+
}
133+
return size;
134+
}
114135
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractTraverseDevice.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
import com.google.common.collect.ImmutableList;
3434
import org.apache.tsfile.file.metadata.IDeviceID;
35+
import org.apache.tsfile.utils.RamUsageEstimator;
3536

3637
import java.util.Collections;
3738
import java.util.List;
@@ -46,6 +47,9 @@
4647
// Show, Count, Update, Delete Devices
4748
public abstract class AbstractTraverseDevice extends Statement {
4849

50+
private static final long INSTANCE_SIZE =
51+
RamUsageEstimator.shallowSizeOfInstance(AbstractTraverseDevice.class);
52+
4953
protected String database;
5054

5155
protected String tableName;
@@ -187,6 +191,10 @@ public void setAttributeColumns(final List<String> attributeColumns) {
187191
this.attributeColumns = attributeColumns;
188192
}
189193

194+
public List<String> getAttributeColumns() {
195+
return attributeColumns;
196+
}
197+
190198
public List<ColumnHeader> getColumnHeaderList() {
191199
return columnHeaderList;
192200
}
@@ -241,4 +249,44 @@ protected String toStringContent() {
241249
+ tagFuzzyPredicate
242250
+ '}';
243251
}
252+
253+
@Override
254+
public long ramBytesUsed() {
255+
return INSTANCE_SIZE + ramBytesUsedForCommonFields();
256+
}
257+
258+
protected long ramBytesUsedForCommonFields() {
259+
long size = 0;
260+
size += AstMemoryEstimationHelper.getEstimatedSizeOfNodeLocation(getLocationInternal());
261+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(table);
262+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(where);
263+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(tagFuzzyPredicate);
264+
size += RamUsageEstimator.sizeOf(database);
265+
size += RamUsageEstimator.sizeOf(tableName);
266+
if (tagDeterminedFilterList != null) {
267+
size += RamUsageEstimator.shallowSizeOf(tagDeterminedFilterList);
268+
for (List<SchemaFilter> filters : tagDeterminedFilterList) {
269+
if (filters != null) {
270+
size += RamUsageEstimator.shallowSizeOf(filters);
271+
for (SchemaFilter filter : filters) {
272+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(filter);
273+
}
274+
}
275+
}
276+
}
277+
if (columnHeaderList != null) {
278+
size += RamUsageEstimator.shallowSizeOf(columnHeaderList);
279+
for (ColumnHeader header : columnHeaderList) {
280+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(header);
281+
}
282+
}
283+
size += AstMemoryEstimationHelper.getEstimatedSizeOfStringList(attributeColumns);
284+
if (partitionKeyList != null) {
285+
size += RamUsageEstimator.shallowSizeOf(partitionKeyList);
286+
for (IDeviceID deviceID : partitionKeyList) {
287+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(deviceID);
288+
}
289+
}
290+
return size;
291+
}
244292
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AddColumn.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
package org.apache.iotdb.db.queryengine.plan.relational.sql.ast;
2121

22+
import org.apache.tsfile.utils.RamUsageEstimator;
23+
2224
import java.util.Collections;
2325
import java.util.List;
2426
import java.util.Objects;
@@ -27,6 +29,8 @@
2729
import static java.util.Objects.requireNonNull;
2830

2931
public class AddColumn extends Statement {
32+
private static final long INSTANCE_SIZE =
33+
RamUsageEstimator.shallowSizeOfInstance(AddColumn.class);
3034

3135
private final QualifiedName tableName;
3236
private final ColumnDefinition column;
@@ -112,4 +116,13 @@ public String toString() {
112116
.add("view", view)
113117
.toString();
114118
}
119+
120+
@Override
121+
public long ramBytesUsed() {
122+
long size = INSTANCE_SIZE;
123+
size += AstMemoryEstimationHelper.getEstimatedSizeOfNodeLocation(getLocationInternal());
124+
size += tableName == null ? 0L : tableName.ramBytesUsed();
125+
size += column == null ? 0L : column.ramBytesUsed();
126+
return size;
127+
}
115128
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AliasedRelation.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.apache.iotdb.db.queryengine.plan.relational.sql.ast;
2121

2222
import com.google.common.collect.ImmutableList;
23+
import org.apache.tsfile.utils.RamUsageEstimator;
2324

2425
import java.util.List;
2526
import java.util.Objects;
@@ -28,6 +29,9 @@
2829
import static java.util.Objects.requireNonNull;
2930

3031
public class AliasedRelation extends Relation {
32+
private static final long INSTANCE_SIZE =
33+
RamUsageEstimator.shallowSizeOfInstance(AliasedRelation.class);
34+
3135
private final Relation relation;
3236
private final Identifier alias;
3337
private final List<Identifier> columnNames;
@@ -109,4 +113,14 @@ public boolean shallowEquals(Node other) {
109113
return alias.equals(otherRelation.alias)
110114
&& Objects.equals(columnNames, otherRelation.columnNames);
111115
}
116+
117+
@Override
118+
public long ramBytesUsed() {
119+
long size = INSTANCE_SIZE;
120+
size += AstMemoryEstimationHelper.getEstimatedSizeOfNodeLocation(getLocationInternal());
121+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(relation);
122+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(alias);
123+
size += AstMemoryEstimationHelper.getEstimatedSizeOfNodeList(columnNames);
124+
return size;
125+
}
112126
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AllColumns.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import com.google.common.base.Joiner;
2323
import com.google.common.collect.ImmutableList;
24+
import org.apache.tsfile.utils.RamUsageEstimator;
2425

2526
import javax.annotation.Nullable;
2627

@@ -32,6 +33,9 @@
3233

3334
public class AllColumns extends SelectItem {
3435

36+
private static final long INSTANCE_SIZE =
37+
RamUsageEstimator.shallowSizeOfInstance(AllColumns.class);
38+
3539
private final List<Identifier> aliases;
3640
@Nullable private final Expression target;
3741

@@ -127,4 +131,13 @@ public boolean shallowEquals(Node other) {
127131

128132
return aliases.equals(((AllColumns) other).aliases);
129133
}
134+
135+
@Override
136+
public long ramBytesUsed() {
137+
long size = INSTANCE_SIZE;
138+
size += AstMemoryEstimationHelper.getEstimatedSizeOfNodeLocation(getLocationInternal());
139+
size += AstMemoryEstimationHelper.getEstimatedSizeOfNodeList(aliases);
140+
size += AstMemoryEstimationHelper.getEstimatedSizeOfAccountableObject(target);
141+
return size;
142+
}
130143
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AllRows.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.apache.iotdb.db.queryengine.plan.relational.sql.ast;
2121

2222
import com.google.common.collect.ImmutableList;
23+
import org.apache.tsfile.utils.RamUsageEstimator;
2324

2425
import javax.annotation.Nonnull;
2526

@@ -28,6 +29,7 @@
2829
import static java.util.Objects.requireNonNull;
2930

3031
public final class AllRows extends Expression {
32+
private static final long INSTANCE_SIZE = RamUsageEstimator.shallowSizeOfInstance(AllRows.class);
3133

3234
public AllRows() {
3335
super(null);
@@ -64,4 +66,11 @@ public int hashCode() {
6466
public boolean shallowEquals(Node other) {
6567
return sameClass(this, other);
6668
}
69+
70+
@Override
71+
public long ramBytesUsed() {
72+
long size = INSTANCE_SIZE;
73+
size += AstMemoryEstimationHelper.getEstimatedSizeOfNodeLocation(getLocationInternal());
74+
return size;
75+
}
6776
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AlterDB.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,16 @@
2121

2222
import org.apache.iotdb.db.queryengine.plan.statement.metadata.DatabaseSchemaStatement;
2323

24+
import org.apache.tsfile.utils.RamUsageEstimator;
25+
2426
import java.util.List;
2527

2628
import static com.google.common.base.MoreObjects.toStringHelper;
2729
import static java.util.Objects.requireNonNull;
2830

2931
public class AlterDB extends DatabaseStatement {
32+
private static final long INSTANCE_SIZE = RamUsageEstimator.shallowSizeOfInstance(AlterDB.class);
33+
3034
public AlterDB(
3135
final NodeLocation location,
3236
final boolean exists,
@@ -53,4 +57,9 @@ public String toString() {
5357
.add("properties", properties)
5458
.toString();
5559
}
60+
61+
@Override
62+
public long ramBytesUsed() {
63+
return INSTANCE_SIZE + ramBytesUsedForCommonFields();
64+
}
5665
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AlterPipe.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@
1919

2020
package org.apache.iotdb.db.queryengine.plan.relational.sql.ast;
2121

22+
import org.apache.tsfile.utils.RamUsageEstimator;
23+
2224
import java.util.Map;
2325
import java.util.Objects;
2426

2527
import static com.google.common.base.MoreObjects.toStringHelper;
2628
import static java.util.Objects.requireNonNull;
2729

2830
public class AlterPipe extends PipeStatement {
31+
private static final long INSTANCE_SIZE =
32+
RamUsageEstimator.shallowSizeOfInstance(AlterPipe.class);
2933

3034
private final String pipeName;
3135
private final boolean ifExistsCondition;
@@ -140,4 +144,15 @@ public String toString() {
140144
.add("isReplaceAllConnectorAttributes", isReplaceAllConnectorAttributes)
141145
.toString();
142146
}
147+
148+
@Override
149+
public long ramBytesUsed() {
150+
long size = INSTANCE_SIZE;
151+
size += AstMemoryEstimationHelper.getEstimatedSizeOfNodeLocation(getLocationInternal());
152+
size += RamUsageEstimator.sizeOf(pipeName);
153+
size += RamUsageEstimator.sizeOfMap(extractorAttributes);
154+
size += RamUsageEstimator.sizeOfMap(processorAttributes);
155+
size += RamUsageEstimator.sizeOfMap(connectorAttributes);
156+
return size;
157+
}
143158
}

0 commit comments

Comments
 (0)