SQL - Query Octopus Database for Fragmentation

Octopus.Script exported 2021-05-25 by millerjn21 belongs to ‘SQL Server’ category.

This step template will run a fragmentation query on your Octopus database and report the results of the tables.

If you would like to set this up as a scheduled runbook and get the results in an email, please follow these instructions:

  1. Create a Send an Email step after this step in your process
  2. Set the body type of that email to HTML, and the body to#{Octopus.Action[STEPNAMEHERE].Output.EmailData}
  3. Set the Run Condition of that Send an Email step to Variable, and the value to #{if Octopus.Action[STEPNAMEHERE].Output.Alert== “True”}True#{/if}. If you don’t do this, you will receive an email regardless of if the threshold was hit.‘

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

SQL Server

IndexFragmentSQLServer =

Enter the Hostname or IP address of your server. Include \Instance if necessary.

SQL Server Port

IndexFragmentSQLPort =

If left blank, 1433 will be used by default.

SQL Server Database Name

IndexFragmentDatabaseName =

null

Fragmentation Threshold

IndexFragmentFragmentation =

Input the percentage of Fragmentation you would like to be alerted for.

Page Count Threshold

IndexFragmentPageCount =

Input the minimum page count a table must have to be considered in the results.

SQL Server Authentication Username

IndexFragmentSQLUsername =

Please leave blank if you want to use Integrated Security.

SQL Server Authentication Password

IndexFragmentSQLPassword =

Please leave blank if you want to use Integrated Security.

Script body

Steps based on this template will execute the following PowerShell script.

###PARAMETERS

[string]$sqlUsername = $OctopusParameters["IndexFragmentSQLUsername"]
[string]$sqlPassword = $OctopusParameters["IndexFragmentSQLPassword"]
[int]$threshold = $OctopusParameters["IndexFragmentFragmentation"]
[string]$SQLServer = $OctopusParameters["IndexFragmentSQLServer"]
[string]$SQLPort = $OctopusParameters["IndexFragmentSQLPort"]
[string]$databaseName = $OctopusParameters["IndexFragmentDatabaseName"]
[string]$pageCount = $OctopusParameters["IndexFragmentPageCount"]


if ([string]::IsNullOrWhiteSpace($SQLPort)){
$SQLPort = "1433"
}

#create the full sql server string
[string]$SQLServerFull = $SQLServer + "," + $SQLPort

#creating the connectionString based on choice of auth
if ([string]::IsNullOrWhiteSpace($sqlUserName)){
	Write-Highlight "Integrated Authentication being used to connect to SQL."
    $connectionString = "Server=$SQLServerFull;Database=$databaseName;integrated security=true;"
}
else {
	Write-Highlight "SQL Authentication being used to connect to SQL"
    $connectionString = "Server=$SQLServerFull;Database=$databaseName;User ID=$sqlUsername;Password=$sqlPassword;"
}

#function for running the query
function ExecuteSqlQuery ($connectionString, $SQLQuery) {
    $Datatable = New-Object System.Data.DataTable
    $Connection = New-Object System.Data.SQLClient.SQLConnection
    $Connection.ConnectionString = $connectionString
	try{
    	$Connection.Open()
    	$Command = New-Object System.Data.SQLClient.SQLCommand
    	$Command.Connection = $Connection
    	$Command.CommandText = $SQLQuery
    	$Reader = $Command.ExecuteReader()
    	$Datatable.Load($Reader)
    }
    catch{
    	Write-Error $_.Exception.Message
    }
    finally{
    	if (($Connection.State) -ne "Closed"){
        Write-Highlight "Closing the SQL Connection."
    	$Connection.Close()   
        }
    }
    return $Datatable
}

#Create the query for fragmentation check
$query = @"
SELECT S.name as 'Schema',
T.name as 'Table',
I.name as 'Index',
DDIPS.avg_fragmentation_in_percent,
DDIPS.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS DDIPS
INNER JOIN sys.tables T on T.object_id = DDIPS.object_id
INNER JOIN sys.schemas S on T.schema_id = S.schema_id
INNER JOIN sys.indexes I ON I.object_id = DDIPS.object_id
AND DDIPS.index_id = I.index_id
WHERE DDIPS.database_id = DB_ID()
and I.name is not null
AND DDIPS.avg_fragmentation_in_percent > 0
ORDER BY DDIPS.avg_fragmentation_in_percent desc
"@

#Run the query against the server and return as a dataset
$resultsDataTable = New-Object System.Data.DataTable
$resultsDataTable = ExecuteSqlQuery $connectionString $query 

#creating variables for later use
$highestFrag = 0
$array = @()

#build an array of html so the data is readable
$dataforemail = @()
$dataforemail += "<header>  <h1>SQL Fragmentation Report</h1></header><br>"
$dataforemail += '<table border="1">'
$dataforemail += "<tr> <td> Table </td><td>Index</td><td>Fragmentation %</td><td>Page Count</td></td>"
foreach ($row in $resultsDataTable){
	#checking if the current row's fragmentation % is higher than our highest if it is, set it
	if ($row.avg_fragmentation_in_percent -gt $highestFrag -and $row.page_count -gt $pageCount){
		$highestFrag = $row.avg_fragmentation_in_percent
	}
    #if both thresholds are hit, put the data in HTML format and also an array to later write to console.
	if ($row.avg_fragmentation_in_percent -gt $threshold -and $row.page_count -gt $pageCount){
        $percent = [math]::Round($row.avg_fragmentation_in_percent,2)
		$dataforemail += "<tr>" 
		$dataforemail += "<td>" + $row.Table + "</td>"
		$dataforemail += "<td>" + $row.Index + "</td>"
        $dataforemail += "<td>" + [string]$percent + "</td>"
        $dataforemail += "<td>" + $row.page_count + "</td>"
		$dataforemail += "</tr>"
        
        $arrayRow = "" | Select Table,Index,avg_fragmentation_in_percent,page_count
    	$arrayRow.Table = $Row.Table
    	$arrayRow.Index = $Row.Index
        $arrayRow.avg_fragmentation_in_percent = [string]$percent
        $arrayRow.page_count = $Row.page_count
    	$array += $arrayRow
	}
}
$dataforemail += "</table>"

#if the threshold has been reached, output data and create output variable for sending email.
if ($highestFrag -gt $threshold){

	#convert the array to a string to email
	[string]$bodyofemail = [string]$dataforemail

	#Create all of the necessary variables and output the data
		Set-OctopusVariable -name "EmailData" -value "$dataforemail"
        Set-OctopusVariable -name "Alert" -value "True"
        $output = $array | Out-String
        Write-Highlight 'Here are the results for your database fragmentation. The following tables had above the provided fragmentation % and minimum page count. If you would like to get an email alert with the data, please refer to the description of the step template for instructions on setting that up.'
        Write-Highlight $output
}
else{

	Write-Highlight "No alert is required."
    Set-OctopusVariable -name "Alert" -value "False"


}

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "b362bd69-4a69-42c1-bcb5-2a134549ef3f",
  "Name": "SQL - Query Octopus Database for Fragmentation",
  "Description": "This step template will run a fragmentation query on your Octopus database and report the results of the tables.\n\nIf you would like to set this up as a scheduled runbook and get the results in an email, please follow these instructions:\n1) Create a Send an Email step after this step in your process\n2) Set the body type of that email to HTML, and the body to#{Octopus.Action[STEPNAMEHERE].Output.EmailData} \n3) Set the Run Condition of that Send an Email step to Variable, and the value to #{if Octopus.Action[STEPNAMEHERE].Output.Alert== \"True\"}True#{/if}. If you don't do this, you will receive an email regardless of if the threshold was hit.'",
  "Version": 1,
  "ExportedAt": "2021-05-25T19:02:40.382Z",
  "ActionType": "Octopus.Script",
  "Author": "millerjn21",
  "Packages": [],
  "Parameters": [
    {
      "Id": "05a6a3f3-3cb9-4d75-abac-b2125fb84a3b",
      "Name": "IndexFragmentSQLServer",
      "Label": "SQL Server",
      "HelpText": "Enter the Hostname or IP address of your server. Include \\Instance if necessary.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "8d6081b3-b934-475b-8b73-cde72f5d085d",
      "Name": "IndexFragmentSQLPort",
      "Label": "SQL Server Port",
      "HelpText": "If left blank, 1433 will be used by default.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "42671f3c-763e-4dbd-836d-ed794d4b0005",
      "Name": "IndexFragmentDatabaseName",
      "Label": "SQL Server Database Name",
      "HelpText": null,
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "0e439749-1fa9-40f2-9843-126ade5576b1",
      "Name": "IndexFragmentFragmentation",
      "Label": "Fragmentation Threshold",
      "HelpText": "Input the percentage of Fragmentation you would like to be alerted for.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "7050d208-a267-412a-9677-95e90909264c",
      "Name": "IndexFragmentPageCount",
      "Label": "Page Count Threshold",
      "HelpText": "Input the minimum page count a table must have to be considered in the results.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "4a9d3846-c454-483f-9066-60a1f2cf7413",
      "Name": "IndexFragmentSQLUsername",
      "Label": "SQL Server Authentication Username",
      "HelpText": "Please leave blank if you want to use Integrated Security.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "f04df930-bb05-49c1-b6f0-51e97dce3bad",
      "Name": "IndexFragmentSQLPassword",
      "Label": "SQL Server Authentication Password",
      "HelpText": "Please leave blank if you want to use Integrated Security.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptBody": "###PARAMETERS\n\n[string]$sqlUsername = $OctopusParameters[\"IndexFragmentSQLUsername\"]\n[string]$sqlPassword = $OctopusParameters[\"IndexFragmentSQLPassword\"]\n[int]$threshold = $OctopusParameters[\"IndexFragmentFragmentation\"]\n[string]$SQLServer = $OctopusParameters[\"IndexFragmentSQLServer\"]\n[string]$SQLPort = $OctopusParameters[\"IndexFragmentSQLPort\"]\n[string]$databaseName = $OctopusParameters[\"IndexFragmentDatabaseName\"]\n[string]$pageCount = $OctopusParameters[\"IndexFragmentPageCount\"]\n\n\nif ([string]::IsNullOrWhiteSpace($SQLPort)){\n$SQLPort = \"1433\"\n}\n\n#create the full sql server string\n[string]$SQLServerFull = $SQLServer + \",\" + $SQLPort\n\n#creating the connectionString based on choice of auth\nif ([string]::IsNullOrWhiteSpace($sqlUserName)){\n\tWrite-Highlight \"Integrated Authentication being used to connect to SQL.\"\n    $connectionString = \"Server=$SQLServerFull;Database=$databaseName;integrated security=true;\"\n}\nelse {\n\tWrite-Highlight \"SQL Authentication being used to connect to SQL\"\n    $connectionString = \"Server=$SQLServerFull;Database=$databaseName;User ID=$sqlUsername;Password=$sqlPassword;\"\n}\n\n#function for running the query\nfunction ExecuteSqlQuery ($connectionString, $SQLQuery) {\n    $Datatable = New-Object System.Data.DataTable\n    $Connection = New-Object System.Data.SQLClient.SQLConnection\n    $Connection.ConnectionString = $connectionString\n\ttry{\n    \t$Connection.Open()\n    \t$Command = New-Object System.Data.SQLClient.SQLCommand\n    \t$Command.Connection = $Connection\n    \t$Command.CommandText = $SQLQuery\n    \t$Reader = $Command.ExecuteReader()\n    \t$Datatable.Load($Reader)\n    }\n    catch{\n    \tWrite-Error $_.Exception.Message\n    }\n    finally{\n    \tif (($Connection.State) -ne \"Closed\"){\n        Write-Highlight \"Closing the SQL Connection.\"\n    \t$Connection.Close()   \n        }\n    }\n    return $Datatable\n}\n\n#Create the query for fragmentation check\n$query = @\"\nSELECT S.name as 'Schema',\nT.name as 'Table',\nI.name as 'Index',\nDDIPS.avg_fragmentation_in_percent,\nDDIPS.page_count\nFROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS DDIPS\nINNER JOIN sys.tables T on T.object_id = DDIPS.object_id\nINNER JOIN sys.schemas S on T.schema_id = S.schema_id\nINNER JOIN sys.indexes I ON I.object_id = DDIPS.object_id\nAND DDIPS.index_id = I.index_id\nWHERE DDIPS.database_id = DB_ID()\nand I.name is not null\nAND DDIPS.avg_fragmentation_in_percent > 0\nORDER BY DDIPS.avg_fragmentation_in_percent desc\n\"@\n\n#Run the query against the server and return as a dataset\n$resultsDataTable = New-Object System.Data.DataTable\n$resultsDataTable = ExecuteSqlQuery $connectionString $query \n\n#creating variables for later use\n$highestFrag = 0\n$array = @()\n\n#build an array of html so the data is readable\n$dataforemail = @()\n$dataforemail += \"<header>  <h1>SQL Fragmentation Report</h1></header><br>\"\n$dataforemail += '<table border=\"1\">'\n$dataforemail += \"<tr> <td> Table </td><td>Index</td><td>Fragmentation %</td><td>Page Count</td></td>\"\nforeach ($row in $resultsDataTable){\n\t#checking if the current row's fragmentation % is higher than our highest if it is, set it\n\tif ($row.avg_fragmentation_in_percent -gt $highestFrag -and $row.page_count -gt $pageCount){\n\t\t$highestFrag = $row.avg_fragmentation_in_percent\n\t}\n    #if both thresholds are hit, put the data in HTML format and also an array to later write to console.\n\tif ($row.avg_fragmentation_in_percent -gt $threshold -and $row.page_count -gt $pageCount){\n        $percent = [math]::Round($row.avg_fragmentation_in_percent,2)\n\t\t$dataforemail += \"<tr>\" \n\t\t$dataforemail += \"<td>\" + $row.Table + \"</td>\"\n\t\t$dataforemail += \"<td>\" + $row.Index + \"</td>\"\n        $dataforemail += \"<td>\" + [string]$percent + \"</td>\"\n        $dataforemail += \"<td>\" + $row.page_count + \"</td>\"\n\t\t$dataforemail += \"</tr>\"\n        \n        $arrayRow = \"\" | Select Table,Index,avg_fragmentation_in_percent,page_count\n    \t$arrayRow.Table = $Row.Table\n    \t$arrayRow.Index = $Row.Index\n        $arrayRow.avg_fragmentation_in_percent = [string]$percent\n        $arrayRow.page_count = $Row.page_count\n    \t$array += $arrayRow\n\t}\n}\n$dataforemail += \"</table>\"\n\n#if the threshold has been reached, output data and create output variable for sending email.\nif ($highestFrag -gt $threshold){\n\n\t#convert the array to a string to email\n\t[string]$bodyofemail = [string]$dataforemail\n\n\t#Create all of the necessary variables and output the data\n\t\tSet-OctopusVariable -name \"EmailData\" -value \"$dataforemail\"\n        Set-OctopusVariable -name \"Alert\" -value \"True\"\n        $output = $array | Out-String\n        Write-Highlight 'Here are the results for your database fragmentation. The following tables had above the provided fragmentation % and minimum page count. If you would like to get an email alert with the data, please refer to the description of the step template for instructions on setting that up.'\n        Write-Highlight $output\n}\nelse{\n\n\tWrite-Highlight \"No alert is required.\"\n    Set-OctopusVariable -name \"Alert\" -value \"False\"\n\n\n}\n"
  },
  "Category": "SQL Server",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/SQL-Query-Octopus-Database-for-Fragmentation.json",
  "Website": "/step-templates/b362bd69-4a69-42c1-bcb5-2a134549ef3f",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Tuesday, May 25, 2021