[ASTERIXDB-3359][COMP] Project only the necessary columns on delete
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
When a delete operation is initiated, all columns will be projected.
This is inefficient as only a few columns are needed. Namely, the
columns of the delete predicate and the indexed columns (if any).
Change-Id: I51a26f40b1ba0597a66f08a78097cd20a42c4c76
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18172
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Wail Alkowaileet <wael.y.k@gmail.com>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnValueAccessPushdownProcessor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnValueAccessPushdownProcessor.java
index 7db3dd2..30844a7 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnValueAccessPushdownProcessor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnValueAccessPushdownProcessor.java
@@ -32,8 +32,10 @@
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.InsertDeleteUpsertOperator;
/**
* Computes the expected schema for columnar datasets (whether internal or external). The expected schema is then
@@ -84,6 +86,13 @@
for (UseDescriptor useDescriptor : useDescriptors) {
LogicalVariable producedVariable = useDescriptor.getProducedVariable();
ILogicalOperator op = useDescriptor.getOperator();
+ if (isDelete(op)) {
+ /*
+ * Delete operation uses the record variable as an expression. Hence, all fields will be projected.
+ * This is inefficient as only the columns of the delete predicate AND the indexed columns are needed.
+ */
+ continue;
+ }
IVariableTypeEnvironment typeEnv = PushdownUtil.getTypeEnv(op, context);
expressionVisitor.transform(useDescriptor.getExpression(), producedVariable, typeEnv);
}
@@ -101,4 +110,13 @@
}
}
}
+
+ private boolean isDelete(ILogicalOperator op) {
+ if (op.getOperatorTag() != LogicalOperatorTag.INSERT_DELETE_UPSERT) {
+ return false;
+ }
+
+ InsertDeleteUpsertOperator deleteOp = (InsertDeleteUpsertOperator) op;
+ return deleteOp.getOperation() == InsertDeleteUpsertOperator.Kind.DELETE;
+ }
}