none
Estatística sobre Indices - clustering factor RRS feed

  • Pergunta

  • Olá Gustavo,
    Parabens pelo post, muito bem explicado. .. Voce que trabalha muito com índices, veja se pode me ajudar... Preciso acessar alguma estatística do SQL SERVER que  mede o quanto uma determinada coluna na tabela (coluna essa indexada)  possui os valores próximos no mesmo bloco do disco.

    veja esse exemplo (do Oracle):

    SQL> create table disorganized
      2  as
      3  select x.*
      4    from (select * from stage
              order by dbms_random.random) x
      5  /
    Table created.

    No exemplo a tabela DISORGANIZED foi criada utilizando uma função RANDOM para ficar desordenada de propósito. Neste caso ela irá necessitar  de muito I/O pois embora tenha o indice, para buscar os dados na tabela, terá que percorrer varios blocos, e precisar ter muitos acessos ao índice também.

    Uma solução para esse problema seria recriar a tabela, ordenando pela coluna envolvida (indexada), como abaixo:

    SQL> create table organized
      2  as
      3  select x.*
      4    from (select * from stage
                 order by object_name) x
      5  /
    Table created.

    Pergunta: No SQL SERVER tem alguma estatística que de para saber de antemão qual é o grau de agrupamento de dados na TABELA de uma determinada coluna, para poder  diferenciar quando um índice é bom ou não.????
    Qualquer ajuda é bem vinda! Obrigado

     []'s
    sábado, 30 de agosto de 2014 19:33

Respostas

  • Pela descrição inicial que você colocou do caso e pelas referências, no SQL Server o que você procura pode ser encontrado na DMV abaixo, a fragmentação dos dados no disco fisico:

    sys.dm_db_index_physical_stats
    http://msdn.microsoft.com/en-us/library/ms188917.aspx

    Mas por outro lado a sua pergunta final, parece estar relacionada a criação de indices e não de analise dos existentes, e se os dados estão fragmentados ou não, antes da criação, não importa, pois a criação do indice irá ordena-los pela chave escolhida (Dentro do Indice).

    E sobre um indice ser bom ou não, não tem tanta relação a sua fragmentação, e sim está mais relacionado ao seu tipo de uso: SCAN ou SEEK.

    Veja esse video do Brent Ozar, que fala um pouco sobre isso e vai até além do SQL Server:

    https://www.youtube.com/watch?v=fD1CZVc6oUk


    Alex Rosa - Premier Field Engineer - Data Platform

    Disclaimer: This content is provided "as-is" and without warranties of any kind, either express or implied. You should therefore verify any information contained in the content before acting on it.



    domingo, 31 de agosto de 2014 14:29

Todas as Respostas

  • Deleted
    domingo, 31 de agosto de 2014 10:33
  • Pela descrição inicial que você colocou do caso e pelas referências, no SQL Server o que você procura pode ser encontrado na DMV abaixo, a fragmentação dos dados no disco fisico:

    sys.dm_db_index_physical_stats
    http://msdn.microsoft.com/en-us/library/ms188917.aspx

    Mas por outro lado a sua pergunta final, parece estar relacionada a criação de indices e não de analise dos existentes, e se os dados estão fragmentados ou não, antes da criação, não importa, pois a criação do indice irá ordena-los pela chave escolhida (Dentro do Indice).

    E sobre um indice ser bom ou não, não tem tanta relação a sua fragmentação, e sim está mais relacionado ao seu tipo de uso: SCAN ou SEEK.

    Veja esse video do Brent Ozar, que fala um pouco sobre isso e vai até além do SQL Server:

    https://www.youtube.com/watch?v=fD1CZVc6oUk


    Alex Rosa - Premier Field Engineer - Data Platform

    Disclaimer: This content is provided "as-is" and without warranties of any kind, either express or implied. You should therefore verify any information contained in the content before acting on it.



    domingo, 31 de agosto de 2014 14:29
  • Segue uma questão

    "Mas por outro lado a sua pergunta final, parece estar relacionada a criação de indices e não de analise dos existentes, e se os dados estão fragmentados ou não, antes da criação, não importa, pois a criação do indice irá ordena-los pela chave escolhida (Dentro do Indice)."

    Importa sim, pois se os dados estão fragmentados na tabela, se voce criar um indice tudo bem, vai ficar mais rápido, mas a busca aos dados não será sequencial, pois os dados não estão necessariamente ordenados no disco pela coluna indexada. Pense assim, imagine uma tabela que os dados estejam armazenados fisicamente, na ordem de uma coluna chamada matricula, se voce tiver um indice sobre essa coluna e fazer uma busca where matricula > 330040, é lógico que irá ser muito mais rapido do que se estivesse em uma tabela onde os dados estivessem fisicamente em uma sequencia aleatória

    Obrigado pela dica da função  sys.dm_db_index_physical_stats era isso  mesmo que eu gostaria de saber.

    domingo, 31 de agosto de 2014 18:57