protected override void OnExecute()
        {
            var dictionary = getDictionaryFunc();

            dictionary.Clear();
            using (var scope = new DatabaseScope(context.Database.Name))
            {
                foreach (var s in context.StatementsData.All)
                {
                    IExplainResult explainResult = null;
                    try
                    {
                        explainResult = explainRepository.Eplain(s.Value.RepresentativeStatistics.RepresentativeStatement);
                    }
                    catch (Exception ex)
                    {
                        log.Write(ex);
                    }
                    dictionary.Add(s.Key, explainResult ?? new EmptyExplainResult());
                }
            }
        }
Exemple #2
0
        protected override void OnExecute()
        {
            using (var scope = new DatabaseScope(context.Database.Name))
            {
                foreach (var env in context.HPartitioningDesignData.Environments)
                {
                    try
                    {
                        virtualHPartitioningsRepository.DestroyAll();
                        bool hPartitioningCreated = false;
                        try
                        {
                            var targetRelationData = context.RelationsData.GetReplacementOrOriginal(env.Partitioning.Relation.ID);
                            virtualHPartitioningsRepository.Create(dbObjectDefinitionGenerator.Generate(env.Partitioning.WithReplacedRelation(targetRelationData)));
                            hPartitioningCreated = true;
                        }
                        catch (Exception ex)
                        {
                            log.Write(ex);
                        }
                        if (hPartitioningCreated)
                        {
                            foreach (var queryPair in context.StatementsData.AllQueriesByRelation[env.Partitioning.Relation.ID])
                            {
                                var statementID = queryPair.NormalizedStatementID;
                                if (!env.StatementsEvaluation.ContainsKey(statementID))
                                {
                                    var            workloadStatement       = context.StatementsData.All[statementID];
                                    var            normalizedStatement     = workloadStatement.NormalizedStatement;
                                    var            representativeStatement = workloadStatement.RepresentativeStatistics.RepresentativeStatement;
                                    var            statementToUse          = RepresentativeStatementReplacementUtility.Provide(normalizedStatement, representativeStatement, context.RelationsData);
                                    var            realPlan      = context.RealExecutionPlansForStatements[statementID].Plan;
                                    IExplainResult explainResult = context.RealExecutionPlansForStatements[statementID];
                                    var            latestPlan    = realPlan;
                                    if (normalizedStatement.CommandType == DAL.Contracts.StatementQueryCommandType.Select ||
                                        normalizedStatement.CommandType == DAL.Contracts.StatementQueryCommandType.Insert)    // hypo pg currently does not support explain for delete/update for h partitioning
                                    {
                                        try
                                        {
                                            explainResult = explainRepository.Eplain(statementToUse);
                                            latestPlan    = explainResult.Plan;
                                        }
                                        catch (Exception ex)
                                        {
                                            log.Write(ex);
                                        }
                                    }

                                    VirtualEnvironmentStatementEvaluation statementEvaluation = new VirtualEnvironmentStatementEvaluation();
                                    statementEvaluation.ExecutionPlan = explainResult;
                                    decimal fromPrice = realPlan.TotalCost;
                                    decimal toPrice   = latestPlan.TotalCost;
                                    decimal divisor   = Math.Abs(Math.Max(fromPrice, toPrice));
                                    if (divisor > 0)
                                    {
                                        statementEvaluation.LocalImprovementRatio = ((toPrice - fromPrice) / divisor) * -1m;
                                    }
                                    decimal statementPortion = context.StatementsData.AllExecutionsCount > 0 ? workloadStatement.TotalExecutionsCount / (decimal)context.StatementsData.AllExecutionsCount : 0m;
                                    statementEvaluation.GlobalImprovementRatio = statementEvaluation.LocalImprovementRatio * statementPortion;
                                    env.StatementsEvaluation.Add(statementID, statementEvaluation);

                                    env.Evaluation.ImprovementRatio += statementEvaluation.GlobalImprovementRatio;
                                }
                            }
                            env.IsImproving = env.Evaluation.ImprovementRatio >= settings.HPartitioningMinTotalImprovementRatio;
                        }
                    }
                    finally
                    {
                        virtualHPartitioningsRepository.DestroyAll();
                    }
                }
            }
        }