public void PublishNormalizedStatementIndexStatistics(LogEntryStatementIndexStatisticsData indexStatisticsData)
        {
            var key    = indexStatisticsData.NormalizedStatementFingerprint;
            var sample = new NormalizedStatementIndexStatistics()
            {
                AvgTotalCost        = indexStatisticsData.TotalCost,
                CreatedDate         = DateTime.Now,
                DatabaseID          = indexStatisticsData.DatabaseID,
                Date                = indexStatisticsData.ExecutionDate,
                IndexID             = indexStatisticsData.IndexID,
                MaxTotalCost        = indexStatisticsData.TotalCost,
                MinTotalCost        = indexStatisticsData.TotalCost,
                TotalIndexScanCount = 1
            };

            lock (lockObject)
            {
                if (!statementIndexStatistics.ContainsKey(key))
                {
                    statementIndexStatistics.Add(key, new NormalizedStatementIndexStatisticsSampler(dateTimeSelector, null));
                }
            }
            lock (String.Intern(key))
            {
                statementIndexStatistics[key].AddSample(sample);
            }
        }
 public static void ApplySample(NormalizedStatementIndexStatistics cumulativeData, NormalizedStatementIndexStatistics newSample)
 {
     cumulativeData.MaxTotalCost = Math.Max(cumulativeData.MaxTotalCost, newSample.MaxTotalCost);
     cumulativeData.MinTotalCost = Math.Min(cumulativeData.MinTotalCost, newSample.MinTotalCost);
     if (cumulativeData.TotalIndexScanCount > 0 || newSample.TotalIndexScanCount > 0)
     {
         cumulativeData.AvgTotalCost = (cumulativeData.TotalIndexScanCount * cumulativeData.AvgTotalCost
                                        + newSample.TotalIndexScanCount * newSample.AvgTotalCost
                                        )
                                       / (cumulativeData.TotalIndexScanCount + newSample.TotalIndexScanCount);
     }
     else
     {
         cumulativeData.AvgTotalCost = newSample.AvgTotalCost;
     }
     cumulativeData.TotalIndexScanCount += newSample.TotalIndexScanCount;
 }
Beispiel #3
0
        private void PersistStatementIndexStatistics(NormalizedStatementIndexStatistics newStatistics)
        {
            var repository = repositories.GetNormalizedStatementIndexStatisticsRepository();
            var uniqueKey  = new NormalizedStatementIndexStatisticsUniqueKey()
            {
                DatabaseID            = newStatistics.DatabaseID,
                Date                  = newStatistics.Date,
                IndexID               = newStatistics.IndexID,
                NormalizedStatementID = newStatistics.NormalizedStatementID
            };
            var oldStatistics = repository.GetByUniqueKey(uniqueKey);

            if (oldStatistics == null)
            {
                repository.Create(newStatistics);
            }
            else
            {
                NormalizedStatementIndexStatisticsMergeUtility.ApplySample(oldStatistics, newStatistics);
                repository.Update(oldStatistics);
            }
        }