Powershell e o dia a dia do DBA – Checando Fragmentação dos Índices


 

Bom pessoal, vamos a mais um que não se encontra no checklist, mas achei importante que é a checagem da fragmentação dos índices. O script a seguir somente carrega essa informações dos indices de todas de todos os bancos (menos os de sistema) de todos os servidores do txt. Ela pode ser facilmente modificada e virar uma função em que vc passa o average que quer..algo como > 50..etc

Ela me grava na tabela o servidor, data, banco, tabela e as informações dos indices são : nome,fillfactor, AveragePageDensity e AverageFragmentation

Este script dei mais um passo no PS aonde consigo formatar o XML a ser criado, somente com os campos que me interessam como vcs podem ver no script

Criar a Tabela no SQL SERVER

USE [DBA]
GO

/****** Object:  Table [Diario].[tb_fragmentacao]    Script Date: 11/06/2008 01:44:30 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [Diario].[tb_fragmentacao](
    [servidor] [varchar](40) NULL,
    [data] [datetime] NULL,
    [banco] [varchar](50) NULL,
    [tabela] [varchar](50) NULL,
    [InfIndices] [xml] NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

Script em PS

 

[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null

$datas = (get-date).toshortdatestring()

##########################################################
#Atribui o Dabatase e Server central que receberão os dados
##########################################################

$ServidorCentral = "WINDOWS-6D9049D\MSSQLSERVER_1"
$DatabaseCentral = "DBA"

$sql = "truncate table diario.tb_fragmentacao"
Invoke-Sqlcmd -ServerInstance $ServidorCentral -Database $DatabaseCentral -Query $sql

foreach ($svr in get-content "C:\dadosps\servidores.txt" )
{
    $data = ""
    $Servidor=New-Object "Microsoft.SqlServer.Management.Smo.Server" "$svr"
    $Servidor.Databases   | where-object {$_.IsSystemObject -eq $FALSE -and
    $_.IsAccessible -eq $TRUE -and $_.name -eq "DBA" } | foreach {
         $banco = $_.name
         foreach  ($tabelas in $Servidor.Databases[$_.name].tables ) {
          $tabela = $tabelas.name
          foreach ($indices in $tabelas.indexes) {

                 $Fragmentacao = $indices.EnumFragmentation(3)
                 $objeto =  New-Object PSObject
                 $objeto | add-member Noteproperty NomeIndice  $indices.name
                 $objeto | add-member Noteproperty FillFactor  $indices.FillFactor
                 $objeto | add-member Noteproperty AveragePageDensity $Fragmentacao.Rows[0].AveragePageDensity
                 $objeto | add-member Noteproperty AverageFragmentation $Fragmentacao.Rows[0].AverageFragmentation
                 $objeto | export-clixml c:\dadosps\indices.xml

                 $valores = Get-Content "c:\dadosps\indices.xml"
                 $valores = $valores -replace "’", "”"

                 $sql = "set dateformat dmy insert into diario.tb_fragmentacao (servidor,data,banco,tabela,InfIndices) values (‘$svr’,’$DataHoje’,’$banco’,’$Tabela’,’$valores’)"
                 Invoke-Sqlcmd -ServerInstance $ServidorCentral -Database $DatabaseCentral -Query $sql
                 del c:\dadosps\indices.xml -ErrorAction "silentlycontinue"

          }

         }

        }                           

 

Prontinho..depois estarei colocando como retornar essa informações  do XML…O Fernando esta me ajudando a entender mais o Xquery

Abraços

I´ll be back

About Laerte Junior

Laerte Junior Laerte Junior is a SQL Server specialist and an active member of WW SQL Server and the Windows PowerShell community. He also is a huge Star Wars fan (yes, he has the Darth Vader´s Helmet with the voice changer). He has a passion for DC comics and living the simple life. "May The Force be with all of us"
This entry was posted in Powershell. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s