locked
Quantas vezes a tabela foi acessada RRS feed

  • Pergunta

  • Boa noite,

    Existe alguma maneira de saber quantas vezes uma determinada tabela foi acessada?

    Obrigado!!

    segunda-feira, 13 de julho de 2009 00:42

Respostas

  • Bom Dia,

    No SQL Server 2005 é complicado mas é possível. Na parte de consultas você pode pesquisar na sys.dm_db_index_usage_stats para verificar a quantidade de Seeks e Scans de cada índice da tabela. Na parte de INSERTs, UPDATEs e DELETEs só mesmo com o uso de triggers. Outra possibilidade é o uso do SQL Trace, mas dependendo do acesso essa saída pode provocar um overhead indesejável.

    Existem ferramentas de terceiros especialistas em estatísticas de dados e acessos e servem exatamente para esse tipo de métrica. No SQL Server 2008 podemos fazer esse controle de forma nativa através do SQL Audit.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Pivoteando, Despivoteando, Transpondo, Invertendo Colunas e Linhas no SQL Server
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!629.entry

     


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 14 de julho de 2009 00:29
    • Marcado como Resposta sergioduarte terça-feira, 14 de julho de 2009 00:36
    terça-feira, 14 de julho de 2009 00:29

Todas as Respostas

  • Ola Sergio.

    Explique melhor sua necessidade..
    Quantas vezes = qnt de insert ou update?

    Att.

    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    segunda-feira, 13 de julho de 2009 12:18
    Moderador
  • Olá, boa noite

    Quero saber quantas vezes a tabela foi referenciada por queries, para ter uma noção do uso em relação as consultas; se fosse possível saber também a quantidade de inserts e updates também seria ótimo

    Valeu.
    terça-feira, 14 de julho de 2009 00:25
  • Bom Dia,

    No SQL Server 2005 é complicado mas é possível. Na parte de consultas você pode pesquisar na sys.dm_db_index_usage_stats para verificar a quantidade de Seeks e Scans de cada índice da tabela. Na parte de INSERTs, UPDATEs e DELETEs só mesmo com o uso de triggers. Outra possibilidade é o uso do SQL Trace, mas dependendo do acesso essa saída pode provocar um overhead indesejável.

    Existem ferramentas de terceiros especialistas em estatísticas de dados e acessos e servem exatamente para esse tipo de métrica. No SQL Server 2008 podemos fazer esse controle de forma nativa através do SQL Audit.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Pivoteando, Despivoteando, Transpondo, Invertendo Colunas e Linhas no SQL Server
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!629.entry

     


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 14 de julho de 2009 00:29
    • Marcado como Resposta sergioduarte terça-feira, 14 de julho de 2009 00:36
    terça-feira, 14 de julho de 2009 00:29
  • Bom Dia,

    Segue um método um pouco rudimentar... Não é preciso, mas dá pra se ter uma idéia...

    USE TEMPDB
    GO
    -- Cria uma tabela
    CREATE TABLE tbl (CODIGO INT, NOME CHAR(1000), Tipo INT)
    -- Insere 10.000 registros
    DECLARE @i INT
    SET @i = 1
    WHILE @i < 10000
    BEGIN
     INSERT INTO tbl VALUES (@i, REPLICATE('a',1000), @i % 1000)
     SET @i = @i + 1
    END
    -- Cria dois índices
    CREATE CLUSTERED INDEX IDX ON tbl (Codigo)
    CREATE NONCLUSTERED INDEX IX ON tbl (Tipo)
    -- Verifica quantas vezes os índices foram "tocados"
    -- As colunas User_Seeks e User_Scans, User_LookUps e User_Updates estão em branco
    SELECT * FROM sys.dm_db_index_usage_stats
    WHERE
     Database_Id = DB_ID() AND
     Object_ID = OBJECT_ID('tbl')
    -- Faz uma leitura dos 10 primeiros registros
    SELECT * FROM tbl WHERE Codigo <= 10
    -- A coluna User_Seeks aumenta o Seek em 1, pois, a consulta anterior fez uma pesquisa
    SELECT * FROM sys.dm_db_index_usage_stats
    WHERE
     Database_Id = DB_ID() AND
     Object_ID = OBJECT_ID('tbl')
    -- Seleciona todos os registros com o tipo igual a 1
    SELECT * FROM tbl WHERE Tipo = 1
    -- Aumenta o User Seeks do Index_ID = 2 e o Look Up do Clustered Index
    SELECT * FROM sys.dm_db_index_usage_stats
    WHERE
     Database_Id = DB_ID() AND
     Object_ID = OBJECT_ID('tbl')
    -- Deleta 100 registros
    DELETE TOP (100) FROM tbl
    -- Aumenta o User_Updates dos dois índices
    SELECT * FROM sys.dm_db_index_usage_stats
    WHERE
     Database_Id = DB_ID() AND
     Object_ID = OBJECT_ID('tbl')

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Pivoteando, Despivoteando, Transpondo, Invertendo Colunas e Linhas no SQL Server
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!629.entry


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 14 de julho de 2009 12:34
  • Gustavo,

    Eu também tive a mesma linha de pensamento, mas, e se a consulta realizar um table scan? Existe uma forma de pegar isso no 2005?

    Abraços
    Demétrio Silva
    terça-feira, 14 de julho de 2009 12:41
  • Olá Demétrio,

    Se a tabela for clusterizada, o Index Scan do Clustered Index irá aumentar. Se a tabela não for clusterizada, haverá uma entrada caracterizando-a como HEAP TABLE (Index_ID = 0).

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Pivoteando, Despivoteando, Transpondo, Invertendo Colunas e Linhas no SQL Server
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!629.entry


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 14 de julho de 2009 14:21
  • Entendi.

    No caso, a única difrença seria o index_id = 0

    Valeu.
    Demétrio Silva
    terça-feira, 14 de julho de 2009 15:20