Rodrigo's profileRodrigo's spacePhotosBlogLists Tools Help

Blog


    April 14

    Calculando espaço livre por Filegroup

    Pessoal, boa noite!
     
    Resolvi mais uma vez compartilhar um pouco mais sobre o meu dia a dia com SQL Server, como já disse trabalho com um VLDB, e para gerenciá-lo, muitas vezes precisamos nos utilizarmos de técnicas como a "dividir para conquistar", sim existe um algoritmo com esse nome e sim estou falando de particionamento e filegroups.
     
    Hoje infelizmente ainda sofremos com as dificuldades do dia a dia de um DBA, pois estamos com deficiência em ferramentas de monitoração reativa e principalmente pró-ativa no meu cliente isso não é diferente, estão implementando o MOM apenas agora, imaginem apenas um dos nossos databases possui exatos 11TB e falo de OLTP, trabalhamos hoje com um volume total de dados em torno de 40TB apenas em OLTP e temos desafios e dificuldades de bancos de alguns GBs.
     
    Bom todos sabemos que os filegroups em conjunto com particionamento nos ajudam em diversas atividades, exemplo: backup, switch de dados históricos, distribuição de I/O e etc.
     
    Pois bem, hoje o cliente veio me solicitar um SCRIPT para monitorar o Free Space dos Filegroups com seus respectivos arquivos individuais, pois bem a primeira coisa que pensei foi, bom no SSMS existe isso, vou capturar a query e trabalhar em cima disso e foi o realmente eu fiz.
     
    A query abaixo foi adaptada e hoje nós passamos a utilizá-la em um processo batch diário de coleta do espaço por filegroup e também podemos disponibilizar um relatório em SSRS para monitoração ad-hoc.
     
     

    if exists (select * from sys.objects where name = 'usp_FGCalc')

    drop proc usp_FGCalc;

    go

    --Usar o novo database e calcular o espao dos FGs

    CREATE

    PROC usp_FGCalc (@dbname as nvarchar(128))

    AS

    /*

    Funcionalidade: Calcular o espao livre em cada arquivo de um Filegroup,

    funcionalidade baseada nas queries do SSMS.

    Adapatado por: Rodrigo Fernandes de Souza

    Empresa: Microsoft Brasil

    Compatibilidade: SQL Server 2005/2008

    Data: 13/04/2009

    */

    SET

    NOCOUNT ON;

    DECLARE

    @cmd nvarchar(4000), @dbid int;

    SET

    @dbid = DB_ID(@dbname)

    if

    @dbid is null

    begin

    RAISERROR('Database does not exists!', 16, 1);

    RETURN;

    end

    CREATE TABLE #FGSpace

    (FileId int, FileGroup int,

    TotalExtents

    int, UsedExtents int,

    Name

    sysname, FileName nchar(520))

    SET @cmd = 'USE ' + @dbname + CHAR(10) + CHAR(13) +

    'Insert #FGSpace EXEC (''DBCC SHOWFILESTATS() WITH NO_INFOMSGS'')';

    EXEC sp_executesql @cmd;

    Select

    mf

    .name As [LogicalName],

    fg

    .name As [FGName],

    mf

    .physical_name As [FileName],

    mf

    .size * CONVERT(float, 8) As [Current_FileSize],

    CAST (CASE mf.[type]

    WHEN 2 THEN 0 --Retira os FGs de FileStream

    ELSE fgs.UsedExtents * CONVERT(float, 64) --Calcula o tamanho ocupado no arquivo

    END As float) As [UsedSpace],

    CAST (CASE mf.[type]

    WHEN 2 THEN 0 --Retira os FGs de FileStream

    ELSE 100 -(((fgs.UsedExtents * CONVERT(float, 64)) * 100) / (mf.size * CONVERT(float, 8)))

    --Calcula o FreeSpace

    END As int) As [FreeSpace],

    mf

    .[file_id] As [Id]

    From

    sys.filegroups As fg

    INNER JOIN

    sys.master_files As mf

    ON (mf.type = 2

    Or mf.type = 0

    And mf.database_id = @dbid

    And mf.drop_lsn IS NULL

    And mf.data_space_id = fg.data_space_id)

    LEFT OUTER JOIN

    #FgSpace

    As fgs

    ON fgs.Fileid = mf.[file_id]

    ORDER BY

    [Id]

    Asc

     

    Quem está familiarizado com SQL Server desde a versão 2000 no mínimo, deve lembra da função DBCC SHOWFILESTATS, esse comando não documentando basicamente nos retorna o espaço alocado e utilizado em extents no arquivo.

    Lembrando um Extent, corresponde a 8 pages ou seja 8192 * 8 = 64K.

    Com isso é possível já utilizarmos as dmvs novas sys.filegroups e sys.master_files para calcularmos o espaço utilizado e a taxa de espaço livre.

    Pessoal, sei que esse script já pode ser conhecido por alguns, porém vale a pena utilizá-lo, onde você tem casos com muitos filegroups em conjunto com particionamento onde não exista uma ferramenta adequada para monitoração e notificação.

    Espero que seja útil a todos!

    Grande Abraço,

    Rodrigo Fernandes de Souza

    Comments (1)

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    Rodrigowrote:
    Pessoal, fiz uma melhoria no código, para torná-lo bem mais seguro e evitar algumas falhas de pessoas mal-intecionadas.

    Façam bom proveito!

    Abraços,

    Rodrigo Souza
    Apr. 17

    Trackbacks

    The trackback URL for this entry is:
    http://lobo-fernandes.spaces.live.com/blog/cns!9300AD1C5A0A745B!395.trak
    Weblogs that reference this entry
    • None