MCDBA Brasil


  • Home
  • Sobre
  • Contato

Livros





Links Rápidos

SQL Server Builds (All Versions/Editions)


Download SQL Server 2017 (trial)


SQL Server 2017 Feature Pack


SQL Server 2016 Feature Pack


Cumulative Update SQL Server 2017 builds


Cumulative Update SQL Server 2016 builds


Cumulative Update SQL Server 2014 builds


Cumulative Update SQL Server 2012 builds


SQL Server 2005/2008 Samples Databases


Documentando o Servidor SQL Server


Analisando a Performance do Servidor-CheckList


Virtual PASS PT


Faça parte do maior virtual chapter do PASS com conteúdos técnicos em Português sobre SQL Server.

Todos os meses um evento Online para você! Acompanhe aqui os WebCasts já agendados

Sindicalize seu blog ou site ao VirtualPASSPT

SQL Server Blogs

SQL Server Query Processing Team


SQL Programmability & API Development Team


SQL Server Manageability Team


Latin America Support Team


Database + Disk + Performance


Microsoft SQL Server Support


SQL CLR Team


SQL Query Optimization Team


SQL 2005 Code Samples


SQL Server Express Team


SQL SMO Samples


SQL Storage Engine Team


SQL CAT Team


SQL Protocols Team


PSS SQL Server Engineers


Slava Oks on SQLOS


Ken Henderson’s blog


LUTI@Microsoft Blog


kimberly L. Trip’s blog


Fernando Garcia Blog

Downloads

Heap Tables – Por que devemos evitá-las?

por Nilton Pinheiro julho 15, 2007 Nenhum comentário

Ao contrário do índice não cluster, o índice cluster dispensa a utilização de ponteiros e atua diretamente nas páginas de dados de uma tabela. Tabelas que não possuem índice cluster são conhecidas como heap tables e nelas as linhas são gravadas nas páginas de dados sem que exista uma ordenação específica (são gravadas de forma desordenada, aleatória), bem diferente das tabelas que possuem índice cluster, onde as linhas são gravadas seguindo a classificação da chave do índice.

O processo de desfragmentação


Os processos de desfragmentação de índices existentes no SQL Server 2000 não funcionam para desfragmentar tabelas sem índices, eles foram criados para desfragmentar apenas índices. Como as páginas de dados de uma heap table não são regidas por um índice, não é possível desfragmentar uma tabela sem índice cluster utilizando os comandos DBCC DBREINDEX e DBCC INDEXDEFRAG.
 
Para tentar entender melhor, vamos imaginar um cenário onde temos uma tabela com índice cluster e uma outra tabela sem índice cluster. Após várias operações de INSERT, UPDATE e DELETE teremos algo como apresentado na figura abaixo:



Podemos observar que nas páginas de dados da tabela com índice cluster as linhas são gravadas seguindo a classificação do índice. Já na tabela sem índice cluster, as linhas são gravadas de forma aleatória.


Após a desfragmentação das tabelas, o resultado seria semelhante ao seguinte:



Na tabela com índice cluster, a desfragmentação deixou a tabela mais otimizada, liberando as páginas 3 e 4 e condensando os dados nas páginas 1 e 2. Na tabela sem índice cluster, não ocorreram alterações, a tabela continuou utilizando 4 páginas e os dados continuaram fragmentados dentro das páginas.


Com isso, podemos concluir que as páginas de dados de tabelas que possuem índice cluster serão automaticamente desfragmentadas ao executar o processo de desfragmentação disponível no SQL Server 2000. Já as páginas de dados de tabelas sem índice cluster (heap), não serão desfragmentadas.


Como fazer então para desfragmentar uma heap table? O processo de desfragmentação de uma heap table pode ser executado basicamente de duas formas:


1. Movendo os dados da heap table para uma tabela temporária, depois excluir a heap table, recriá-la e re-inserir os dados na nova tabela.


2. Localizar na heap table uma coluna que seja única, criar um índice cluster na coluna e depois excluir o índice cluster.


Um outro ponto onde devemos ficar atentos sobre as heaps é que estas são devoradoras de espaço em disco, principalmente se os dados sofrerem muitas atualizações ou exclusões. Espaços subutilizados em páginas de dados são sinônimos de baixo desempenho, pois força o subsistema de disco a efetuar um número maior de I/Os.  A solução mais prática e recomendada é identificar as heap tables e efetuar a criação de índices cluster adequados.


Para identificar as tabelas sem índice cluster em um database, execute a query abaixo no Query Analyzer:


SELECT object_name(i.id) from sysindexes i
INNER JOIN sysobjects o ON i.id=o.id
WHERE indid=0 AND xtype=’U’


O exemplo prático


Para demonstrar na prática a ineficiência da desfragmentação das páginas de dados em tabelas sem índice cluster, vamos criar uma tabela (TBIDXNCLUSTER) com 20.000 registros e apenas com um índice não cluster.  O script de criação da tebela pode ser visto abaixo.


USE Pubs
GO
CREATE TABLE TBIDXNCLUSTER (col1 int IDENTITY(1,1), col2 char(100),col3 char(100))
GO
declare @count int
SET @count = 1
WHILE @count <20000
BEGIN
     INSERT INTO TBIDXNCLUSTER
     VALUES (‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA’,’BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB’)
     SET @count=@count+1
END
GO
— Cria índice Não Cluster
CREATE NONCLUSTERED INDEX  IDXNCluster ON TBIDXNCLUSTER(col2)


Logo após a criação da tabela e seu respectivo índice, notamos que tanto a fragmentação da tabela (index ID: 0) quanto do índice (index ID: 2) são praticamente nula. A tabela ocupa 2042 páginas e o índice 155, com um fator de densidade médio das páginas (Avg. Page Density) superior a 96%.



Após a exclusão de um grande volume de registros (para forçar a fragmentação), é possível notar uma fragmentação de quase 50% nas páginas de dados da tabela e também nas páginas do índice. Para facilitar a exclusão dos registros, utilizei o script abaixo para exclui todos os registros onde col1 é par.


DELETE FROM TBIDXNCLUSTER WHERE col1%2=0



Para desfragmentar as páginas da tabela, executamos o processo de reindex (DBCC DBREINDEX), porém, observe que apenas o índice não cluster foi desfragmentado, voltando a atingir um fator de densidade média superior a 99% e tendo o número de páginas reduzido para 77.


Como as páginas de dados da tabela não estão associadas a um índice cluster, o processo de reindexação não teve efeito sobre elas, mantendo a fragmentação de 48%. Observe também que o número de Pages Scanned continua exatamente o mesmo de quando a tabela foi criada, 2042.



Para demonstrar a diferença quando se utiliza índice cluster, transformamos a tabela em uma tabela clusterizada. Para isso, removemos o índice não cluster e criamos um índice cluster.


DROP INDEX TBIDXNCLUSTER.IDXNCluster
GO
CREATE CLUSTERED INDEX  IDXCluster ON TBIDXNCLUSTER(col2)


Com a criação do índice cluster, a densidade média das páginas subiu de 48.35% para 98.78%, graças à redução no número de páginas que caiu de 2042 para 1000.



Conclusão


Como vimos, tabelas sem índice cluster são péssimas para performance porque as páginas de dados da tabela nunca serão desfragmentadas, como conseqüência, o subsistema de disco também será sobrecarregado pois terá que efetuar mais leituras que o necessário para obter as informações desejadas.


A solução é escolher uma coluna adequada e criar um índice cluster na tabela. Caso não exista uma coluna adequada, a criação de uma coluna do tipo identity pode resolver o problema, mas evitem ao máximo deixar tabelas sem índice cluster, principalmente se forem tabelas com grandes volumes de dados ou utilizadas em JOINS.


Um abraço
Nilton Pinheiro

Avaliação:
Compartilhe:
  • Anterior Microsoft Anuncia Data de Lançamento do SQL Server 200819 anos atrás
  • Próximo Analisando Problemas de Performance – Estudo de Caso Real19 anos atrás

Deixe uma resposta Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

MVP Reconnect Award

Categorias

  • Artigos (359)
  • Dica da Semana (95)
  • Documentação (54)
  • Downloads (113)
  • MSDE 2000 (3)
  • Sem categoria (1)
  • Tutoriais (9)

Posts recentes

  • #FechouBrasil #PartiuPortugal
  • Brigando com o erro “The cached MSI file is missing”
  • MCDBABRASIL está de volta
  • Documentando o Servidor SQL Server
  • Brigando com os Erros 17182, 17826 e 17120

SQL Server AlwaysOn Video Series

Video1: Introdução ao SQLServer2012 AlwaysOn


Video2: Introdução ao SQLServer2012 AlwaysOn Availability Group


Video3: Introdução ao SQLServer2012 AlwaysOn AVG-Demo


Video4: Introdução ao SQLServer2012 AlwaysOn Listener


Video5: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries


Video6: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries-Demo


Video7: Introdução ao SQLServer2012 AlwaysOn Failover Clustering


Serie SQL Server Failover Clustering End-to-End

Parte 1: Configuração da Rede e Ambiente


Parte 2: Configurando o Windows 2008 R2 Domain Controler e DNS


Parte 3: Preparando os nós para o Failover Cluster


Parte 4: Configurando um Failover Cluster de 2 nós


Parte 5: Configurando as LUNs no iSCSI Software Target (Parte 1)


Parte 6: Configurando as LUNs no iSCSI Software Target (Parte 2)


Parte 7: Apresentando as LUNs para os nós do Failover Cluster


Parte 8: Configurando os discos no Failover Cluster


Parte 9: Instalando a primeira instância virtual do SQL Server 2008


Parte 10: Instalando a segunda instância virtual do SQL Server 2008


Parte 11: Instalando e Configurando o MSDTC no Failover Cluster


Parte 12: Configurando Mount Points no Cluster e SQL Server 2008


Vídeo Extra: Removendo uma Instância do SQL Server 2008 R2 em Cluster


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering Overview


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering na Prática

Menu

  • Home
  • Sobre
  • Contato

Mais

  • RSS Feeds
2026 MCDBA Brasil.