Usuário com melhor resposta
Estatística sobre Indices - clustering factor

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:
[]'s
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
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.aspxMas 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.
- Editado Alex Rosa [MSFT]Microsoft employee domingo, 31 de agosto de 2014 14:31
- Sugerido como Resposta Durval RamosModerator quarta-feira, 3 de setembro de 2014 12:17
- Marcado como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:23
Todas as 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.aspxMas 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.
- Editado Alex Rosa [MSFT]Microsoft employee domingo, 31 de agosto de 2014 14:31
- Sugerido como Resposta Durval RamosModerator quarta-feira, 3 de setembro de 2014 12:17
- Marcado como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:23
-
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.