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()); } } }
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(); } } } }