Search in sources :

Example 1 with Timer

use of io.crate.profile.Timer in project crate by crate.

the class ExplainPlan method executeOrFail.

@Override
public void executeOrFail(DependencyCarrier dependencies, PlannerContext plannerContext, RowConsumer consumer, Row params, SubQueryResults subQueryResults) {
    if (context != null) {
        assert subPlan instanceof LogicalPlan : "subPlan must be a LogicalPlan";
        LogicalPlan plan = (LogicalPlan) subPlan;
        /**
         * EXPLAIN ANALYZE does not support analyzing {@link io.crate.planner.MultiPhasePlan}s
         */
        if (plan.dependencies().isEmpty()) {
            UUID jobId = plannerContext.jobId();
            BaseResultReceiver resultReceiver = new BaseResultReceiver();
            RowConsumer noopRowConsumer = new RowConsumerToResultReceiver(resultReceiver, 0, t -> {
            });
            Timer timer = context.createTimer(Phase.Execute.name());
            timer.start();
            NodeOperationTree operationTree = LogicalPlanner.getNodeOperationTree(plan, dependencies, plannerContext, params, subQueryResults);
            resultReceiver.completionFuture().whenComplete(createResultConsumer(dependencies, consumer, jobId, timer, operationTree));
            LogicalPlanner.executeNodeOpTree(dependencies, plannerContext.transactionContext(), jobId, noopRowConsumer, true, operationTree);
        } else {
            consumer.accept(null, new UnsupportedOperationException("EXPLAIN ANALYZE does not support profiling multi-phase plans, " + "such as queries with scalar subselects."));
        }
    } else {
        if (subPlan instanceof LogicalPlan) {
            PrintContext printContext = new PrintContext();
            ((LogicalPlan) subPlan).print(printContext);
            consumer.accept(InMemoryBatchIterator.of(new Row1(printContext.toString()), SENTINEL), null);
        } else if (subPlan instanceof CopyFromPlan) {
            ExecutionPlan executionPlan = CopyFromPlan.planCopyFromExecution(((CopyFromPlan) subPlan).copyFrom(), dependencies.clusterService().state().nodes(), plannerContext, params, subQueryResults);
            String planAsJson = DataTypes.STRING.implicitCast(PlanPrinter.objectMap(executionPlan));
            consumer.accept(InMemoryBatchIterator.of(new Row1(planAsJson), SENTINEL), null);
        } else {
            consumer.accept(InMemoryBatchIterator.of(new Row1("EXPLAIN not supported for " + subPlan.getClass().getSimpleName()), SENTINEL), null);
        }
    }
}
Also used : CopyFromPlan(io.crate.planner.statement.CopyFromPlan) Row1(io.crate.data.Row1) RowConsumerToResultReceiver(io.crate.action.sql.RowConsumerToResultReceiver) NodeOperationTree(io.crate.execution.dsl.phases.NodeOperationTree) ExecutionPlan(io.crate.planner.ExecutionPlan) Timer(io.crate.profile.Timer) PrintContext(io.crate.planner.operators.PrintContext) BaseResultReceiver(io.crate.action.sql.BaseResultReceiver) LogicalPlan(io.crate.planner.operators.LogicalPlan) RowConsumer(io.crate.data.RowConsumer) UUID(java.util.UUID)

Example 2 with Timer

use of io.crate.profile.Timer in project crate by crate.

the class ExplainStatementAnalyzer method analyze.

public ExplainAnalyzedStatement analyze(Explain node, Analysis analysis) {
    Statement statement = node.getStatement();
    statement.accept(CHECK_VISITOR, null);
    final AnalyzedStatement subStatement;
    ProfilingContext profilingContext;
    if (node.isAnalyze()) {
        profilingContext = new ProfilingContext(List.of());
        Timer timer = profilingContext.createAndStartTimer(ExplainPlan.Phase.Analyze.name());
        subStatement = analyzer.analyzedStatement(statement, analysis);
        profilingContext.stopTimerAndStoreDuration(timer);
    } else {
        profilingContext = null;
        subStatement = analyzer.analyzedStatement(statement, analysis);
    }
    String columnName = SqlFormatter.formatSql(node);
    return new ExplainAnalyzedStatement(columnName, subStatement, profilingContext);
}
Also used : Timer(io.crate.profile.Timer) Statement(io.crate.sql.tree.Statement) ProfilingContext(io.crate.profile.ProfilingContext)

Example 3 with Timer

use of io.crate.profile.Timer in project crate by crate.

the class Planner method visitExplainStatement.

@Override
public Plan visitExplainStatement(ExplainAnalyzedStatement explainAnalyzedStatement, PlannerContext context) {
    ProfilingContext ctx = explainAnalyzedStatement.context();
    if (ctx == null) {
        return new ExplainPlan(explainAnalyzedStatement.statement().accept(this, context), null);
    } else {
        Timer timer = ctx.createAndStartTimer(ExplainPlan.Phase.Plan.name());
        Plan subPlan = explainAnalyzedStatement.statement().accept(this, context);
        ctx.stopTimerAndStoreDuration(timer);
        return new ExplainPlan(subPlan, ctx);
    }
}
Also used : Timer(io.crate.profile.Timer) ProfilingContext(io.crate.profile.ProfilingContext) CreateBlobTablePlan(io.crate.planner.node.ddl.CreateBlobTablePlan) CreateFunctionPlan(io.crate.planner.node.ddl.CreateFunctionPlan) CreateSnapshotPlan(io.crate.planner.node.ddl.CreateSnapshotPlan) AlterTableDropCheckConstraintPlan(io.crate.planner.node.ddl.AlterTableDropCheckConstraintPlan) SetSessionAuthorizationPlan(io.crate.planner.statement.SetSessionAuthorizationPlan) ResetSettingsPlan(io.crate.planner.node.ddl.ResetSettingsPlan) AlterBlobTablePlan(io.crate.planner.node.ddl.AlterBlobTablePlan) CreateUserPlan(io.crate.planner.node.ddl.CreateUserPlan) RerouteRetryFailedPlan(io.crate.planner.node.management.RerouteRetryFailedPlan) ShowCreateTablePlan(io.crate.planner.node.management.ShowCreateTablePlan) DropUserPlan(io.crate.planner.node.ddl.DropUserPlan) ExplainPlan(io.crate.planner.node.management.ExplainPlan) CopyFromPlan(io.crate.planner.statement.CopyFromPlan) AlterTableOpenClosePlan(io.crate.planner.node.ddl.AlterTableOpenClosePlan) CreateAnalyzerPlan(io.crate.planner.node.ddl.CreateAnalyzerPlan) OptimizeTablePlan(io.crate.planner.node.ddl.OptimizeTablePlan) DropRepositoryPlan(io.crate.planner.node.ddl.DropRepositoryPlan) DropAnalyzerPlan(io.crate.planner.node.ddl.DropAnalyzerPlan) AlterTableAddColumnPlan(io.crate.planner.node.ddl.AlterTableAddColumnPlan) UpdateSettingsPlan(io.crate.planner.node.ddl.UpdateSettingsPlan) AlterTablePlan(io.crate.planner.node.ddl.AlterTablePlan) AlterTableReroutePlan(io.crate.planner.node.management.AlterTableReroutePlan) AlterTableRenameTablePlan(io.crate.planner.node.ddl.AlterTableRenameTablePlan) DropSnapshotPlan(io.crate.planner.node.ddl.DropSnapshotPlan) DropFunctionPlan(io.crate.planner.node.ddl.DropFunctionPlan) SetLicensePlan(io.crate.planner.statement.SetLicensePlan) SetSessionPlan(io.crate.planner.statement.SetSessionPlan) CreateRepositoryPlan(io.crate.planner.node.ddl.CreateRepositoryPlan) CreateTablePlan(io.crate.planner.node.ddl.CreateTablePlan) GenericDCLPlan(io.crate.planner.node.dcl.GenericDCLPlan) KillPlan(io.crate.planner.node.management.KillPlan) CopyToPlan(io.crate.planner.statement.CopyToPlan) AlterUserPlan(io.crate.planner.node.ddl.AlterUserPlan) DropTablePlan(io.crate.planner.node.ddl.DropTablePlan) RestoreSnapshotPlan(io.crate.planner.node.ddl.RestoreSnapshotPlan) RefreshTablePlan(io.crate.planner.node.ddl.RefreshTablePlan) ExplainPlan(io.crate.planner.node.management.ExplainPlan)

Aggregations

Timer (io.crate.profile.Timer)3 CopyFromPlan (io.crate.planner.statement.CopyFromPlan)2 ProfilingContext (io.crate.profile.ProfilingContext)2 BaseResultReceiver (io.crate.action.sql.BaseResultReceiver)1 RowConsumerToResultReceiver (io.crate.action.sql.RowConsumerToResultReceiver)1 Row1 (io.crate.data.Row1)1 RowConsumer (io.crate.data.RowConsumer)1 NodeOperationTree (io.crate.execution.dsl.phases.NodeOperationTree)1 ExecutionPlan (io.crate.planner.ExecutionPlan)1 GenericDCLPlan (io.crate.planner.node.dcl.GenericDCLPlan)1 AlterBlobTablePlan (io.crate.planner.node.ddl.AlterBlobTablePlan)1 AlterTableAddColumnPlan (io.crate.planner.node.ddl.AlterTableAddColumnPlan)1 AlterTableDropCheckConstraintPlan (io.crate.planner.node.ddl.AlterTableDropCheckConstraintPlan)1 AlterTableOpenClosePlan (io.crate.planner.node.ddl.AlterTableOpenClosePlan)1 AlterTablePlan (io.crate.planner.node.ddl.AlterTablePlan)1 AlterTableRenameTablePlan (io.crate.planner.node.ddl.AlterTableRenameTablePlan)1 AlterUserPlan (io.crate.planner.node.ddl.AlterUserPlan)1 CreateAnalyzerPlan (io.crate.planner.node.ddl.CreateAnalyzerPlan)1 CreateBlobTablePlan (io.crate.planner.node.ddl.CreateBlobTablePlan)1 CreateFunctionPlan (io.crate.planner.node.ddl.CreateFunctionPlan)1