Skip to content

Commit 0b35b7d

Browse files
Ignore UPDATE STATISTICS for already up-to-date stats
1 parent 7f6ca22 commit 0b35b7d

File tree

5 files changed

+221
-17
lines changed

5 files changed

+221
-17
lines changed

Forms/MainBox.cs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -216,26 +216,41 @@ private void ScanIndexesFinish(object sender, RunWorkerCompletedEventArgs e) {
216216

217217
buttonStopScan.Visibility = BarItemVisibility.Never;
218218

219-
List<Index> indexes = _indexes.Where(_ => _.Fragmentation >= (Settings.Options.SkipOperation == IndexOp.IGNORE ? Settings.Options.FirstThreshold : 0)
220-
&& _.PagesCount >= Settings.Options.MinIndexSize.PageSize()
221-
&& _.PagesCount <= Settings.Options.MaxIndexSize.PageSize())
222-
.OrderBy(_ => _.Fragmentation < Settings.Options.FirstThreshold
223-
&& Settings.Options.SkipOperation != Settings.Options.FirstOperation
224-
? 3
225-
: _.Fragmentation < Settings.Options.SecondThreshold
226-
&& Settings.Options.FirstOperation != Settings.Options.SecondOperation
227-
? 2 : 1 )
228-
.ThenByDescending(_ => (_.Fragmentation + 0.1) * _.PagesCount).ToList();
219+
var o = Settings.Options;
220+
221+
List<Index> indexes = _indexes.Where(_ => _.Fragmentation >= (o.SkipOperation == IndexOp.IGNORE ? o.FirstThreshold : 0)
222+
&& _.PagesCount >= o.MinIndexSize.PageSize()
223+
&& _.PagesCount <= o.MaxIndexSize.PageSize())
224+
.OrderBy(_ => _.Fragmentation < o.FirstThreshold && o.SkipOperation != o.FirstOperation
225+
? 3
226+
: _.Fragmentation < o.SecondThreshold && o.FirstOperation != o.SecondOperation
227+
? 2 : 1 )
228+
.ThenByDescending(_ => (_.Fragmentation + 0.1) * _.PagesCount).ToList();
229229

230230
QueryEngine.UpdateFixType(indexes);
231231
QueryEngine.FindDublicateIndexes(indexes);
232232
QueryEngine.FindUnusedIndexes(indexes);
233233

234+
if (o.StatsIgnoreHoursEnabled || o.StatsIgnoreSampledPercentEnabled) {
235+
indexes.RemoveAll(_ => _.IndexStats != null
236+
&& (
237+
_.FixType == IndexOp.UPDATE_STATISTICS_FULL
238+
|| _.FixType == IndexOp.UPDATE_STATISTICS_RESAMPLE
239+
|| _.FixType == IndexOp.UPDATE_STATISTICS_SAMPLE
240+
)
241+
&& (
242+
(o.StatsIgnoreHoursEnabled && (DateTime.UtcNow - (DateTime)_.IndexStats).TotalHours < o.StatsIgnoreHours)
243+
||
244+
(o.StatsIgnoreSampledPercentEnabled && _.StatsSampled > o.StatsIgnoreSampledPercent)
245+
)
246+
);
247+
}
248+
234249
_ps.Indexes = _ps.IndexesTotal = indexes.Count;
235250
_ps.IndexesSize = indexes.Sum(_ => _.PagesCount);
236251
_ps.SavedSpace = indexes.Sum(_ => _.UnusedPagesCount);
237252
UpdateProgressStats();
238-
253+
239254
Output.Current.Add($"Processed: {_indexes.Count}. Fragmented: {_ps.Indexes}{(_ps.Indexes == 0 ? ". No indexes found. Try searching again or change settings..." : string.Empty)}");
240255

241256
grid.DataSource = indexes;

Forms/SettingsBox.Designer.cs

Lines changed: 152 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Forms/SettingsBox.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,19 @@ private void UpdateControls(Options o) {
5656
boxConnectionTimeout.Value = o.ConnectionTimeout;
5757
boxCommandTimeout.Value = o.CommandTimeout;
5858
boxWaitAtLowPriority.Checked = o.WaitAtLowPriority;
59-
boxMaxDuration.EditValue = o.MaxDuration;
59+
boxMaxDuration.Value = o.MaxDuration;
6060
boxAbortAfterWait.EditValue = o.AbortAfterWait;
6161
boxDataCompression.EditValue = o.DataCompression;
6262
boxNoRecompute.EditValue = o.NoRecompute;
63-
boxFillFactor.EditValue = o.FillFactor;
63+
boxFillFactor.Value = o.FillFactor;
6464
boxScanMode.EditValue = o.ScanMode;
6565
boxShowSettingsWhenConnectionChanged.Checked = o.ShowSettingsWhenConnectionChanged;
6666

67+
boxStatsIgnoreHours.Value = o.StatsIgnoreHours;
68+
boxStatsIgnoreHoursEnabled.Checked = o.StatsIgnoreHoursEnabled;
69+
boxStatsIgnoreSampledPercent.Value = o.StatsIgnoreSampledPercent;
70+
boxStatsIgnoreSampledPercentEnabled.Checked = o.StatsIgnoreSampledPercentEnabled;
71+
6772
boxScanHeap.Checked = o.ScanHeap;
6873
boxScanClusteredIndex.Checked = o.ScanClusteredIndex;
6974
boxScanNonClusteredIndex.Checked = o.ScanNonClusteredIndex;
@@ -108,6 +113,11 @@ public Options GetSettings() {
108113
ScanMode = boxScanMode.EditValue.ToEnum<ScanMode>(),
109114
ShowSettingsWhenConnectionChanged = boxShowSettingsWhenConnectionChanged.Checked,
110115

116+
StatsIgnoreHours = (int)boxStatsIgnoreHours.Value,
117+
StatsIgnoreHoursEnabled = boxStatsIgnoreHoursEnabled.Checked,
118+
StatsIgnoreSampledPercent = (int)boxStatsIgnoreSampledPercent.Value,
119+
StatsIgnoreSampledPercentEnabled = boxStatsIgnoreSampledPercentEnabled.Checked,
120+
111121
ScanHeap = boxScanHeap.Checked,
112122
ScanClusteredIndex = boxScanClusteredIndex.Checked,
113123
ScanNonClusteredIndex = boxScanNonClusteredIndex.Checked,

Forms/SettingsBox.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,4 +192,13 @@
192192
<metadata name="pictureBox4.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
193193
<value>False</value>
194194
</metadata>
195+
<metadata name="groupControl6.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
196+
<value>False</value>
197+
</metadata>
198+
<metadata name="labelControl4.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
199+
<value>False</value>
200+
</metadata>
201+
<metadata name="labelControl10.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
202+
<value>False</value>
203+
</metadata>
195204
</root>

0 commit comments

Comments
 (0)