Skip to content

Commit 8bc9841

Browse files
authored
Merge pull request #406 from VladDBA/dev
Changes for #403 #404 #405
2 parents a96836f + dad2d75 commit 8bc9841

File tree

7 files changed

+94
-60
lines changed

7 files changed

+94
-60
lines changed

PSBlitz.ps1

Lines changed: 53 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,8 @@ param(
302302

303303
###Internal params
304304
#Version
305-
$Vers = "5.9.0"
306-
$VersDate = "2025-10-13"
305+
$Vers = "5.9.1"
306+
$VersDate = "2025-11-13"
307307
$TwoMonthsFromRelease = [datetime]::ParseExact("$VersDate", 'yyyy-MM-dd', $null).AddMonths(2)
308308
$NowDate = Get-Date
309309
#Get script path
@@ -326,18 +326,18 @@ $ResourceList = @("PSBlitzOutput.xlsx", "spBlitz_NonSPLatest.sql", "spBlitzCache
326326

327327
## we use these to make sure someone didn't modify the scripts in the Resources folder
328328
$storedHashes = @{
329-
"spBlitz_NonSPLatest.sql" = "6F403D76832611A2986852CCE08DE6AC63D55AE2BB2241C2E1274CD9E2252D60"
330-
"spBlitzCache_NonSPLatest.sql" = "823327F64BE6E67ECDA5E541DC0311D0C04E2E2D540CC76FD7306933BB7763D2"
331-
"spBlitzFirst_NonSPLatest.sql" = "3AE1F4B5B2337E7B36B25B30999543E2C2DE1C46BDF6D647394EFF7BF2944263"
332-
"spBlitzIndex_NonSPLatest.sql" = "88FB8C452B2E2A5F5D378F045CAAA2B2E37F6B5C7C532BEF37D110D6DE59B7AA"
329+
"spBlitz_NonSPLatest.sql" = "1612EFEEC666112A5EFAAD147804B7AF48FC522E11B63CBBD00E9D9EF529F235"
330+
"spBlitzCache_NonSPLatest.sql" = "098346EB1E816C8BFA59778BCE1186031549F69C068924164717D40680B5884E"
331+
"spBlitzFirst_NonSPLatest.sql" = "65B2BEBAB1BD3F3BB6262B6EB67D159A5B799C512A6F2A7A512672D7E0501D92"
332+
"spBlitzIndex_NonSPLatest.sql" = "21F326BCD6BCFB57A89BBEBD34063FFC6FEFE8376BF4836650E46715134DB41D"
333333
"spBlitzLock_NonSPLatest.sql" = "9B999A5E28ACBA871FD0545C1305B1BD6F1532F9CFACB3C910A3830CAA5FB672"
334334
"spBlitzWho_NonSPLatest.sql" = "B83BD8CBD59295DD0DFE0D25204AC6C81DEED746659844DABBED5FB4CA8D3ABA"
335335
"GetBlitzWhoData.sql" = "1A23F1F9C4CB51252D088919500A7E472B56B98DD5096DBA79B5D96AEEB5F6FC"
336336
"GetInstanceInfo.sql" = "29AA65809886BB2FC870B0DF49256850C4347562ABDDAD29E5BEC6D76C86036F"
337337
"GetTempDBUsageInfo.sql" = "20620509996A6F7BB45410397D0CB5C7C0D044FEA15944950171DF14436AE9D1"
338338
"GetOpenTransactions.sql" = "76EBCB1758CBC86DAC4FE8E5C02E88AB4B96FEDB2E21570B8C0D410FF8A69F7D"
339-
"GetStatsInfoForWholeDB.sql" = "E39F52DFD9BD070F7B233880D02401AF3B72D4111FE87AEDAF1B06C45AFB730B"
340-
"GetIndexInfoForWholeDB.sql" = "6C58B79C4EDF06ADBE4EE79373A522A7C538B331D74E9E4AF32C77C6ED951F9B"
339+
"GetStatsInfoForWholeDB.sql" = "DAA08282A7FF87FDBA7604903F948F59CD0CAE09F08664F1A3CA9177121EE17B"
340+
"GetIndexInfoForWholeDB.sql" = "B8FBF199DF4E054A1700F0E27081841257BF1BA99A09E95E83EB991B2FB52D43"
341341
"GetDbInfo.sql" = "103B639ED78B099A5C2D133E6555B7073CE23DF2DBE4CD7CAD24D44EDB261F7F"
342342
"GetAzureSQLDBInfo.sql" = "8A18348F7B87C2F5DA047B103E3BF4FEBB455E7498F0C93644DC2CD7E7255506"
343343
"GetObjectsWithDangerousOptions.sql" = "AFE74F2FE6D6077AEBF169CC16DE036B08980846E6795DC342372AB8C2A132A9"
@@ -722,7 +722,7 @@ function Convert-TableToHtml {
722722

723723
if (($CSSClass) -and ($TblID)) {
724724
$htmlTableOut = $htmlTableOut -replace "<table>", "<table id=`"$TblID`" class=`"$CSSClass`">"
725-
if ($CSSClass -like "*sortable*"){
725+
if ($CSSClass -like "*sortable*") {
726726
$htmlTableOut = $htmlTableOut -replace "<th>", "<th class=`"sortable`">"
727727
}
728728
if ($CSSClass -eq "InstHealthTbl") {
@@ -737,7 +737,7 @@ function Convert-TableToHtml {
737737
} elseif ($CSSClass) {
738738
$htmlTableOut = $htmlTableOut -replace "<table>", "<table class=`"$CSSClass`">"
739739
#clean up XML noise and extra charcters in specific tables
740-
if ($CSSClass -like "*sortable"){
740+
if ($CSSClass -like "*sortable") {
741741
$htmlTableOut = $htmlTableOut -replace "<th>", "<th class=`"sortable`">"
742742
} elseif ($CSSClass -eq "CacheTabx") {
743743
$htmlTableOut = $htmlTableOut -replace "<td>&lt;\?ClickMe ", "<td>"
@@ -3486,55 +3486,61 @@ $SortableTable `n $htmlTable `n $JumpToTop `n $HTMLBodyEnd
34863486
Invoke-PSBlitzQuery -QueryIn $Query -StepNameIn "Index Frag Info" -ConnStringIn $ConnString -CmdTimeoutIn $MaxTimeout
34873487
if ($global:StepOutcome -eq "Success") {
34883488
$IndexTbl = $global:PSBlitzSet.Tables[0]
3489-
$IndexLckTbl = $global:PSBlitzSet.Tables[1]
3490-
$RecordsReturned = $IndexTbl.Rows.Count
3491-
if ($RecordsReturned -le 0) {
3492-
Write-Host " ->No rows returned."
3489+
$ColumnCount = $IndexTbl.Columns.Count
3490+
if ($ColumnCount -eq 1) {
3491+
Write-Host " ->Skipped due to database size."
3492+
Add-LogRow "Index Frag Info" "Skipped" "Skipped due to database size."
34933493
} else {
3494-
if ($IndexLckTbl.Rows.Count -gt 0) {
3495-
$RowNum = 0
3496-
Write-Host " ->Exclusive lock detected on table(s):"
3497-
$LockedTabList = ""
3498-
$LockedTabLogMsg = "Exclusive locks on table(s):"
3499-
foreach ($row in $IndexLckTbl) {
3500-
$LockedTab = $IndexLckTbl.Rows[$RowNum]["object_name"]
3501-
Write-Host " - $LockedTab"
3502-
if ($RowNum -eq 0) {
3503-
$LockedTabList += "$LockedTab"
3504-
} else {
3505-
$LockedTabList += ", $LockedTab"
3494+
$IndexLckTbl = $global:PSBlitzSet.Tables[1]
3495+
$RecordsReturned = $IndexTbl.Rows.Count
3496+
if ($RecordsReturned -le 0) {
3497+
Write-Host " ->No rows returned."
3498+
} else {
3499+
if ($IndexLckTbl.Rows.Count -gt 0) {
3500+
$RowNum = 0
3501+
Write-Host " ->Exclusive lock detected on table(s):"
3502+
$LockedTabList = ""
3503+
$LockedTabLogMsg = "Exclusive locks on table(s):"
3504+
foreach ($row in $IndexLckTbl) {
3505+
$LockedTab = $IndexLckTbl.Rows[$RowNum]["object_name"]
3506+
Write-Host " - $LockedTab"
3507+
if ($RowNum -eq 0) {
3508+
$LockedTabList += "$LockedTab"
3509+
} else {
3510+
$LockedTabList += ", $LockedTab"
3511+
}
3512+
$RowNum += 1
35063513
}
3507-
$RowNum += 1
3508-
}
35093514

3510-
Add-LogRow "->Index Frag Info" "Skipped XLocked Tables" "$LockedTabLogMsg $LockedTabList"
3511-
}
3512-
if ($ToHTML -eq "Y") {
3515+
Add-LogRow "->Index Frag Info" "Skipped XLocked Tables" "$LockedTabLogMsg $LockedTabList"
3516+
}
3517+
if ($ToHTML -eq "Y") {
35133518

3514-
Write-PSBlitzDebug " ->Converting index info to HTML"
3519+
Write-PSBlitzDebug " ->Converting index info to HTML"
35153520

3516-
$htmlTable = Convert-TableToHtml $IndexTbl -TblID "StatsOrIxFragTable" -ExclCols "database" -CSSClass "sortable" -DebugInfo:$DebugInfo
3517-
$HtmlTabName = "Index fragmentation info for $databaseName"
3518-
$HtmlFileName = "IndexFragInfo_$databaseName.html"
3521+
$htmlTable = Convert-TableToHtml $IndexTbl -TblID "StatsOrIxFragTable" -ExclCols "database" -CSSClass "sortable" -DebugInfo:$DebugInfo
3522+
$HtmlTabName = "Index fragmentation info for $databaseName"
3523+
$HtmlFileName = "IndexFragInfo_$databaseName.html"
35193524

3520-
$html = $HTMLPre + @"
3525+
$html = $HTMLPre + @"
35213526
<title>$HtmlTabName</title>`n $HTMLBodyStart `n<h1>$HtmlTabName</h1>
35223527
$($SearchTableDiv -replace $STDivReplace, "'StatsOrIxFragTable', 0")
35233528
$SortableTable `n $htmlTable `n $JumpToTop `n $HTMLBodyEnd
35243529
"@
35253530

3526-
Save-HtmlFile $html $HtmlFileName $HTMLOutDir $DebugInfo
3527-
Invoke-ClearVariables html, htmlTable
3528-
} else {
3529-
$ExcelSheet = $ExcelFile.Worksheets.Item("Index Fragmentation")
3530-
Convert-TableToExcel $IndexTbl $ExcelSheet -StartRow $DefaultStartRow -DebugInfo:$DebugInfo
3531-
##Saving file
3532-
Save-ExcelFile $ExcelFile
3531+
Save-HtmlFile $html $HtmlFileName $HTMLOutDir $DebugInfo
3532+
Invoke-ClearVariables html, htmlTable
3533+
} else {
3534+
$ExcelSheet = $ExcelFile.Worksheets.Item("Index Fragmentation")
3535+
Convert-TableToExcel $IndexTbl $ExcelSheet -StartRow $DefaultStartRow -DebugInfo:$DebugInfo
3536+
##Saving file
3537+
Save-ExcelFile $ExcelFile
3538+
}
3539+
##Cleaning up variables
3540+
Invoke-ClearVariables IndexTbl, PSBlitzSet
35333541
}
3534-
##Cleaning up variables
3535-
Invoke-ClearVariables IndexTbl, PSBlitzSet
3536-
}
3537-
}
3542+
}
3543+
}
35383544
} else {
35393545
Write-Host " ->Skipping index fragmentation check as requested."
35403546
Add-LogRow "Index Fragmentation" "Skipped" "Index fragmentation check skipped as requested."

Resources/GetIndexInfoForWholeDB.sql

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,20 @@ SET NOCOUNT ON;
1515
SET STATISTICS XML OFF;
1616
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
1717

18+
DECLARE @SkipCheck BIT = 0;
19+
20+
SELECT @SkipCheck = CASE WHEN (SELECT CAST(SUM(CAST([size] AS BIGINT) * 8 / 1024. / 1024.) AS NUMERIC(23, 3))
21+
FROM sys.[database_files] WHERE [type]= 0)> 500 THEN 1
22+
WHEN (SELECT COUNT(1) FROM sys.[partitions] WHERE [partition_number] > 1) >100 THEN 1
23+
WHEN (SELECT COUNT(1) FROM sys.[indexes] i INNER JOIN sys.[tables] t ON i.[object_id] = t.[object_id])>1000
24+
THEN 1 ELSE 0 END;
25+
IF @SkipCheck = 1
26+
BEGIN
27+
SELECT 'Check skipped due to database size' AS Skipped;
28+
RETURN;
29+
END;
30+
ELSE
31+
BEGIN
1832
IF OBJECT_ID('tempdb.dbo.#PSBlitzIXFrag', 'U') IS NOT NULL
1933
DROP TABLE #PSBlitzIXFrag;
2034
SELECT [l].[resource_associated_entity_id]
@@ -77,4 +91,5 @@ SELECT 'Exclusive Lock' AS [xlocked],
7791
FROM #PSBlitzIXFrag;
7892

7993
IF OBJECT_ID('tempdb.dbo.#test', 'U') IS NOT NULL
80-
DROP TABLE #PSBlitzIXFrag;
94+
DROP TABLE #PSBlitzIXFrag;
95+
END;

Resources/GetStatsInfoForWholeDB.sql

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ DECLARE @LineFeed NVARCHAR(5);
1919
DECLARE @MinRecords INT;
2020
DECLARE @Comment NVARCHAR(3);
2121
SET @LineFeed = CHAR(13) + CHAR(10);
22-
SET @Comment = N';--';
22+
SET @Comment = N''/*N';--'*/;
2323

2424
SET @MinRecords = 10000;
2525
/*Make sure temp table doesn't exist*/
@@ -185,7 +185,9 @@ END;
185185

186186
UPDATE ##PSBlitzStatsInfo
187187
SET [update_table_stats] = CASE
188-
WHEN [modified_percent] >= 30.00 OR [sample_percent] < 5.00 THEN N'UPDATE STATISTICS '
188+
WHEN [modified_percent] >= 30.00 OR [sample_percent] < 5.00
189+
/*OR [last_updated] <= CONVERT(DATETIME, GETDATE() - 90)*/
190+
THEN N'UPDATE STATISTICS '
189191
+ QUOTENAME([database]) + N'.'
190192
+ QUOTENAME([object_schema]) + N'.'
191193
+ QUOTENAME([object_name])
@@ -204,15 +206,17 @@ SET [update_table_stats] = CASE
204206
ELSE N';'
205207
END
206208
ELSE N';'
207-
END
209+
END + CHAR(13) + CHAR(10) + N'GO'
208210
ELSE NULL
209211
END
210212

211213
WHERE [id] IN(SELECT MIN([id])
212214
FROM ##PSBlitzStatsInfo
213215
GROUP BY [object_name]);
214216
UPDATE ##PSBlitzStatsInfo SET [update_individual_stats] = CASE
215-
WHEN [modified_percent] >= 30.00 OR [sample_percent] < 5.00 THEN N'UPDATE STATISTICS '
217+
WHEN [modified_percent] >= 30.00 OR [sample_percent] < 5.00
218+
/*OR [last_updated] <= CONVERT(DATETIME, GETDATE() - 90)*/
219+
THEN N'UPDATE STATISTICS '
216220
+ QUOTENAME([database]) + N'.'
217221
+ QUOTENAME([object_schema]) + N'.'
218222
+ QUOTENAME([object_name]) + N'('+QUOTENAME([stats_name])+N')'
@@ -231,15 +235,17 @@ UPDATE ##PSBlitzStatsInfo SET [update_individual_stats] = CASE
231235
ELSE N';'
232236
END
233237
ELSE N';'
234-
END
238+
END + CHAR(13) + CHAR(10) + N'GO'
235239
ELSE NULL
236240
END;
237241
UPDATE ##PSBlitzStatsInfo SET [update_partition_stats] = CASE
238-
WHEN [modified_percent] >= 30.00 OR [sample_percent] < 5.00 THEN N'UPDATE STATISTICS '
242+
WHEN [modified_percent] >= 30.00 OR [sample_percent] < 5.00
243+
/*OR [last_updated] <= CONVERT(DATETIME, GETDATE() - 90)*/
244+
THEN N'UPDATE STATISTICS '
239245
+ QUOTENAME([database]) + N'.'
240246
+ QUOTENAME([object_schema]) + N'.'
241247
+ QUOTENAME([object_name])
242-
+ N' WITH RESAMPLE ON PARTITIONS ('+CAST([partition_number] AS NVARCHAR(20)) +N');'
248+
+ N' WITH RESAMPLE ON PARTITIONS ('+CAST([partition_number] AS NVARCHAR(20)) +N');' + CHAR(13) + CHAR(10) + N'GO'
243249
ELSE NULL
244250
END
245251
WHERE incremental = N'Yes';
@@ -256,6 +262,8 @@ SELECT TOP(10000) /*[id], */
256262
[get_details], [update_table_stats],
257263
[update_individual_stats], [update_partition_stats]
258264
FROM ##PSBlitzStatsInfo
265+
WHERE [modified_percent] >= 30.00
266+
OR [sample_percent] < 5.00
259267
ORDER BY [modified_percent] DESC, [object_name] ASC;
260268

261269
SELECT COUNT(1) AS RecordCount FROM ##PSBlitzStatsInfo;

Resources/spBlitzCache_NonSPLatest.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6266,7 +6266,7 @@ BEGIN
62666266
SELECT [Priority],
62676267
FindingsGroup,
62686268
Finding,
6269-
CASE WHEN [URL] IS NOT NULL
6269+
CASE WHEN [URL] IS NOT NULL AND [URL] <> ''
62706270
THEN
62716271
'<a href='''+[URL]+''' target=''_blank''>'+[Finding]+'</a>'
62726272
ELSE [Finding]

Resources/spBlitzFirst_NonSPLatest.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4879,7 +4879,7 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
48794879
SELECT [Priority] ,
48804880
[FindingsGroup] ,
48814881
[Finding] ,
4882-
CASE WHEN [URL] IS NOT NULL
4882+
CASE WHEN [URL] IS NOT NULL AND [URL] <> ''
48834883
THEN '<a href='''+[URL]+''' target=''_blank''>'+[Finding]+'</a>'
48844884
ELSE [Finding]
48854885
END AS [FindingHL],
@@ -4894,6 +4894,7 @@ If one of them is a lead blocker, consider killing that query.'' AS HowToStopit,
48944894
CAST([QueryPlan] AS NVARCHAR(MAX)) AS QueryPlan*/
48954895
FROM #BlitzFirstResults
48964896
WHERE (@Seconds > 0 OR (Priority IN (0, 250, 251, 255))) /* For @Seconds = 0, filter out broken checks for now */
4897+
AND CheckID <> -1
48974898
ORDER BY Priority ,
48984899
FindingsGroup ,
48994900
CASE

Resources/spBlitzIndex_NonSPLatest.sql

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5980,9 +5980,13 @@ BEGIN
59805980
SELECT TOP(10000) Priority, ISNULL(br.findings_group,N'') +
59815981
CASE WHEN ISNULL(br.finding,N'') <> N'' THEN N': ' ELSE N'' END
59825982
+ br.finding AS [Finding],
5983+
CASE WHEN [URL] IS NOT NULL AND [URL] <> ''
5984+
THEN
59835985
'<a href='''+[URL]+''' target=''_blank''>'+ISNULL(br.findings_group,N'') +
5984-
CASE WHEN ISNULL(br.finding,N'') <> N'' THEN N': ' ELSE N'' END
5985-
+ br.finding+'</a>' AS [FindingHL], /*Column added for PSBlitz*/
5986+
CASE WHEN ISNULL(br.finding,N'') <> N''
5987+
THEN N': ' ELSE N'' END
5988+
+ br.finding+'</a>'
5989+
ELSE N'' END AS [FindingHL], /*Column added for PSBlitz*/
59865990
br.[database_name] AS [Database Name],
59875991
br.details AS [Details: schema.table.index(indexid)],
59885992
br.index_definition AS [Index Definition], /*column name change for PSBlitz*/

Resources/spBlitz_NonSPLatest.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10525,7 +10525,7 @@ IF @ProductVersionMajor >= 10 AND NOT EXISTS ( SELECT 1
1052510525
-replace "&#39; target=&#39;_blank&#39;&gt;", "' target=`"_blank`">"
1052610526
-replace "&lt;/a&gt;","</a>"
1052710527
*/
10528-
CASE WHEN [URL] IS NOT NULL
10528+
CASE WHEN [URL] IS NOT NULL AND [URL] <> ''
1052910529
THEN
1053010530
'<a href='''+[URL]+''' target=''_blank''>'+[Finding]+'</a>'
1053110531
ELSE [Finding] END AS [FindingHL],

0 commit comments

Comments
 (0)