Vous êtes sur la page 1sur 18

07/03/2017 sys.

dm_db_index_physical_stats(TransactSQL)

sys.dm_db_index_physical_stats Transact
SQL

Publicado: dezembro de 2016

ESTE TPICO APLICASE A: SQL Server comeando com o 2008 Banco de Dados SQL do Azure Azure SQL
Data Warehouse Parallel Data Warehouse

Retorna informaes de tamanho e fragmentao dos dados e ndices da tabela ou exibio especificada no SQL Server. Para
um ndice, uma linha retornada para cada nvel da rvore B em cada partio. Para um heap, uma linha retornada para a
unidade de alocao de IN_ROW_DATA de cada partio. Para dados LOB objeto grande, uma linha retornada para a
unidade de alocao de LOB_DATA de cada partio. Se houver dados de estouro de linha na tabela, uma linha ser
retornada para a unidade de alocao de ROW_OVERFLOW_DATA em cada partio. Retorna informaes sobre ndices de
columnstore otimizado de memria xVelocity.

Importante

Se voc consultar db_index_physical_stats em uma instncia de servidor que est hospedando um sempre no rplica
secundria legvel https://technet.microsoft.com/ptbr/library/ff878253.aspx, voc pode encontrar um impedimento
redo. Isso ocorre porque essa exibio de gerenciamento dinmico adquire um bloqueio IS na exibio ou tabela de
usurio especificada, que pode bloquear solicitaes por um thread REDO para um bloqueio X na exibio ou tabela de
usurio.

db_index_physical_stats no retorna informaes sobre ndices com otimizao de memria. Para obter informaes sobre
o uso do ndice com otimizao de memria, consulte sys.dm_db_xtp_index_stats TransactSQL
https://technet.microsoft.com/ptbr/library/dn133081.aspx.

Convenes de sintaxe TransactSQL https://technet.microsoft.com/ptbr/library/ms177563.aspx

Sintaxe


sys.dm_db_index_physical_stats(
{database_id|NULL|0|DEFAULT}
,{object_id|NULL|0|DEFAULT}
,{index_id|NULL|0|1|DEFAULT}
,{partition_number|NULL|0|DEFAULT}
,{mode|NULL|DEFAULT}
)

Argumentos
https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 1/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

database_id | NULL | 0 | PADRO


a ID do banco de dados. database_id smallint. As entradas vlidas so o nmero da ID de um banco de dados, NULL, 0
ou DEFAULT. O padro 0. NULL, 0 e DEFAULT so valores equivalentes neste contexto.

Especifique NULL para retornar informaes de todos os bancos de dados na instncia do SQL Server. Se voc especificar
NULL para database_id, voc tambm dever especificar NULL para object_id, index_id, e nmero_da_partio.

A funo interna DB_ID https://technet.microsoft.com/ptbr/library/ms186274.aspx pode ser especificado. Quando voc


usar DB_ID sem especificar um nome de banco de dados, o nvel de compatibilidade do banco de dados atual dever ser 90
ou mais.

object_id | NULL | 0 | PADRO


a ID do objeto da tabela ou exibio em que o ndice est ativado. object_id int.

As entradas vlidas so o nmero da ID de uma tabela e de uma exibio, NULL, 0 ou DEFAULT. O padro 0. NULL, 0 e
DEFAULT so valores equivalentes neste contexto. Como de SQL Server 2016, as entradas vlidas incluem tambm o nome
de fila do agente de servio ou o nome da tabela interna de fila. Quando os parmetros padro so aplicados ou seja, todos
os objetos, todos os ndices, etc, informaes sobre a fragmentao de todas as filas so includos no conjunto de
resultados.

Especifique NULL para retornar informaes de todas as tabelas e exibies no banco de dados especificado. Se voc
especificar NULL para object_id, voc tambm dever especificar NULL para index_id e nmero_da_partio.

index_id | 0 | NULL | 1 | PADRO


a ID do ndice. index_id int. As entradas vlidas so o nmero de identificao de um ndice, 0 se object_id for um heap,
NULL, 1 ou DEFAULT. O padro 1. NULL, 1 e DEFAULT so valores equivalentes neste contexto.

Especifique NULL para retornar informaes de todos os ndices de uma tabela base ou exibio. Se voc especificar NULL
para index_id, voc tambm dever especificar NULL para nmero_da_partio.

nmero_da_partio | NULL | 0 | PADRO


o nmero da partio no objeto. nmero_da_partio int. As entradas vlidas so o partion_number de um ndice ou
heap, NULL, 0 ou DEFAULT. O padro 0. NULL, 0 e DEFAULT so valores equivalentes neste contexto.

Especifique NULL para retornar informaes de todas as parties do objeto proprietrio.

nmero_da_partio baseado em 1. Um heap ou ndice no particionado tem nmero_da_partio definido como 1.

mode | NULL | PADRO


o nome do modo. modo Especifica o nvel de verificao que usado para obter estatsticas. modo de sysname. Entradas
vlidas so DEFAULT, NULL, LIMITED, SAMPLED ou DETAILED. O padro NULL LIMITED.

Tabela retornada

Nome da Tipo de
Description
coluna dados

database_i smallint Identificao do banco de dados da tabela ou exibio.


d

object_id int Identificao de objeto da tabela ou exibio na qual o ndice se encontra.

index_id int Identificao de um ndice.

0 = Heap.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 2/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

Nome da Tipo de
Description
coluna dados

partition_n int Nmero de partio de base&1; no objeto proprietrio; uma tabela, exibio ou ndice.
umber
1 = ndice ou heap no particionado.

index_type nvarchar Descrio do tipo de ndice:


_desc 60
HEAP

CLUSTERED INDEX

NONCLUSTERED INDEX

PRIMARY XML INDEX

SPATIAL INDEX

XML INDEX

NDICE de mapeamento do COLUMNSTORE interno

NDICE de DELETEBUFFER COLUMNSTORE interno

NDICE de DELETEBITMAP COLUMNSTORE interno

hobt_id bigint Heap ou rvore B ID do ndice ou partio.

Alm de retornar o hobt_id de ndices definidos pelo usurio, isso tambm retorna o hobt_id
dos ndices columnstore interno.

alloc_unit_ nvarchar Descrio do tipo de unidade de alocao:


type_desc 60
IN_ROW_DATA

LOB_DATA

ROW_OVERFLOW_DATA

Unidade de alocao LOB_DATA contm os dados que esto armazenados em colunas do


tipo texto, ntext, imagem, varchar max, nvarchar max, varbinary max, e xml. Para
obter mais informaes, veja Tipos de dados TransactSQL
https://technet.microsoft.com/ptbr/library/ms187752.aspx.

Unidade de alocao ROW_OVERFLOW_DATA contm os dados que esto armazenados em


colunas do tipo varchar n, nvarchar, varbinary, e sql_variant que foram empurrados para
fora da linha.

index_dept tinyint Nmero de nveis de ndice.


h
1 = Heap ou unidade de alocao LOB_DATA ou ROW_OVERFLOW_DATA.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 3/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

Nome da Tipo de
Description
coluna dados

index_level tinyint Nvel atual do ndice.

0 para nveis folha de ndice, heaps e unidades de alocao LOB_DATA ou


ROW_OVERFLOW_DATA.

Maior que 0 para nveis de ndice nonleaf. index_level ser o mais alto no nvel raiz de um
ndice.

Os nveis no folha dos ndices s so processadas quando modo = DETAILED.

avg_fragm float Fragmentao lgica para ndices ou fragmentao de extenso para heaps na unidade de
entation_i alocao IN_ROW_DATA.
n_percent
O valor medido como uma porcentagem e leva em considerao vrios arquivos. Para
definies de fragmentao lgica e de extenso, consulte Comentrios.

0 para unidades de alocao LOB_DATA e ROW_OVERFLOW_DATA.

NULL para heaps quando modo = SAMPLED.

fragment_ bigint Nmero de fragmentos no nvel folha de uma unidade de alocao IN_ROW_DATA. Para
count obter mais informaes sobre fragmentos, consulte Comentrios.

NULL para nveis no folha de um ndice e unidades de alocao LOB_DATA ou


ROW_OVERFLOW_DATA.

NULL para heaps quando modo = SAMPLED.

avg_fragm float Nmero mdio de pginas em um fragmento no nvel folha de uma unidade de alocao
ent_size_in IN_ROW_DATA.
_pages
NULL para nveis no folha de um ndice e unidades de alocao LOB_DATA ou
ROW_OVERFLOW_DATA.

NULL para heaps quando modo = SAMPLED.

page_coun bigint Nmero total de pginas de ndice ou dados.


t
Para um ndice, o nmero total de pginas de ndice no nvel atual da rvore b na unidade de
alocao IN_ROW_DATA.

Para um heap, o nmero total de pginas de dados na unidade de alocao IN_ROW_DATA.

Para as unidades de alocao LOB_DATA ou ROW_OVERFLOW_DATA, o nmero total de


pginas na unidade de alocao.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 4/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

Nome da Tipo de
Description
coluna dados

avg_page_ float Porcentagem mdia de espao de armazenamento de dados disponvel usada em todas as
space_use pginas.
d_in_perce
nt Para um ndice, a mdia se aplica ao nvel atual da rvore b na unidade de alocao
IN_ROW_DATA.

Para um heap, a mdia de todas as pginas de dados na unidade de alocao IN_ROW_DATA.

Para as unidades de alocao LOB_DATA ou ROW_OVERFLOW DATA, a mdia de todas as


pginas na unidade de alocao.

NULL quando modo = LIMITED.

record_co bigint Nmero total de registros.


unt
Para um ndice, o nmero total de registros se aplica ao nvel atual da rvore b na unidade de
alocao IN_ROW_DATA.

Para um heap, o nmero total de registros na unidade de alocao IN_ROW_DATA.

Observao: para um heap, o nmero de registros retornados por essa funo pode no
corresponder o nmero de linhas retornadas pela execuo de uma contagem de selecionar
* contra o heap. Isso porque uma linha pode conter vrios registros. Por exemplo, em
algumas situaes de atualizao, uma nica linha de heap pode ter um registro de
encaminhamento e um registro encaminhado como resultado de uma operao de
atualizao. Da mesma forma, a maior parte das linhas de LOB grandes dividida em vrios
registros no armazenamento LOB_DATA.

Para as unidades de alocao LOB_DATA ou ROW_OVERFLOW_DATA, o nmero total de


registros na unidade de alocao completa.

NULL quando modo = LIMITED.

ghost_reco bigint Nmero de registros fantasmas prontos para remoo pela tarefa de limpeza fantasma na
rd_count unidade de alocao.

0 para nveis no folha de um ndice na unidade de alocao de IN_ROW_DATA.

NULL quando modo = LIMITED.

version_gh bigint Nmero de registros fantasmas retidos por uma transao de isolamento de instantneo
ost_record pendente em uma unidade de alocao.
_count
0 para nveis no folha de um ndice na unidade de alocao de IN_ROW_DATA.

NULL quando modo = LIMITED.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 5/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

Nome da Tipo de
Description
coluna dados

min_recor int Tamanho de registro mnimo em bytes.


d_size_in_
bytes Para um ndice, o tamanho de registro mnimo aplicase ao nvel atual da rvore b na unidade
de alocao IN_ROW_DATA.

Para um heap, o tamanho de registro mnimo na unidade de alocao IN_ROW_DATA.

Para as unidades de alocao LOB_DATA ou ROW_OVERFLOW_DATA, o tamanho de registro


mnimo na unidade de alocao completa.

NULL quando modo = LIMITED.

max_recor int Tamanho de registro mximo em bytes.


d_size_in_
bytes Para um ndice, o tamanho de registro mximo aplicase ao nvel atual da rvore b na
unidade de alocao IN_ROW_DATA.

Para um heap, o tamanho de registro mximo na unidade de alocao IN_ROW_DATA.

Para as unidades de alocao LOB_DATA ou ROW_OVERFLOW_DATA, o tamanho de registro


mximo na unidade de alocao completa.

NULL quando modo = LIMITED.

avg_record float Tamanho de registro mdio em bytes.


_size_in_by
tes Para um ndice, o tamanho de registro mdio aplicase ao nvel atual da rvore b na unidade
de alocao IN_ROW_DATA.

Para um heap, o tamanho de registro mdio na unidade de alocao IN_ROW_DATA.

Para as unidades de alocao LOB_DATA ou ROW_OVERFLOW_DATA, o tamanho de registro


mdio na unidade de alocao completa.

NULL quando modo = LIMITED.

forwarded bigint Nmero de registros em um heap com ponteiros encaminhados a outro local de dados. Esse
_record_co estado ocorre durante uma atualizao, quando no h espao suficiente para armazenar a
unt nova linha no local original.

NULL para qualquer unidade de alocao diferente das unidades de alocao IN_ROW_DATA
de um heap.

NULL para heaps quando modo = LIMITED.

compresse bigint O nmero total de pginas compactadas.


d_page_co
unt Para heaps, as pginas alocadas recentemente no so compactadas com PAGE. Um heap
compactado com PAGE em duas condies especiais: quando os dados so importados em
massa ou quando um heap reconstrudo. Operaes DML tpicas que causam alocaes de
pgina no tero compactao PAGE. Reconstrua um heap quando o valor
compressed_page_count aumentar ultrapassando o limite desejado.

Para tabelas que tm um ndice clusterizado, o valor compressed_page_count indica a


eficincia da compactao PAGE.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 6/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

Nome da Tipo de
Description
coluna dados

hobt_id bigint Aplicase a: SQL Server SQL Server 2016 at a verso atual
http://go.microsoft.com/fwlink/p/?LinkId=299658, Banco de dados SQL do Azure.

Para apenas ndices columnstore, esta a ID para um conjunto de linhas que rastreia dados
columnstore interno para uma partio. Os conjuntos de linhas so armazenados como dados
heaps ou binrio rvores. Eles tm a mesma ID de ndice que o ndice de columnstore pai.
Para obter mais informaes, consulte sys.internal_partitions TransactSQL
https://technet.microsoft.com/ptbr/library/dn917448.aspx.

NULO se

column_st tinyint Aplicase a: SQL Server SQL Server 2016 at a verso atual
ore_delete http://go.microsoft.com/fwlink/p/?LinkId=299658, Banco de dados SQL do Azure.
_buffer_sta
te 0 = NOT_APPLICABLE

1 = OPEN

2 = DESCARGA

3 = A LIBERAO

4 = DESATIVADO

5 = PRONTO

column_st Aplicase a: SQL Server SQL Server 2016 at a verso atual


ore_delete http://go.microsoft.com/fwlink/p/?LinkId=299658, Banco de dados SQL do Azure.
_buff_state
_desc NOT_APPLICABLE o ndice pai no um ndice columnstore.

OPEN Excluidores e scanners de uslo.

DESCARREGANDO Excluidores so drenagem mas scanners ainda uslo.

LIBERANDO buffer fechado e linhas no buffer esto sendo gravadas no bitmap de


excluso.

DESATIVAR linhas no buffer de excluso fechado foram gravados para o bitmap de


excluso, mas o buffer no foi truncado porque os scanners ainda esto usando. Novo
scanners no precisam usar o buffer obsoletos porque o buffer aberto suficiente.

PRONTO esse buffer de excluso est pronto para uso.

Comentrios
A funo de gerenciamento dinmico sys.dm_db_index_physical_stats substitui a instruo DBCC SHOWCONTIG.

Modos de exame

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 7/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

O modo em que a funo executada determina o nvel do exame executado para obter os dados estatsticos usados pela
funo. modo especificado como LIMITED, SAMPLED ou DETAILED. A funo atravessa as cadeias de pginas para as
unidades de alocao que compem as parties especificadas da tabela ou ndice. db_index_physical_stats requer apenas
um bloqueio IS bloqueio de tabela, independentemente do modo que ele executado.

O modo LIMITED o mais rpido e examina o menor nmero de pginas. Para um ndice, apenas as pginas de nvel pai da
rvore b ou seja, aquelas acima do nvel folha so examinadas. Para um heap, as pginas PFS e IAM associadas so
examinadas, e as pginas de dados de um heap so examinadas no modo LIMITED.

Com o modo LIMITED, compressed_page_count NULL porque o Mecanismo de Banco de Dados s examina as pginas no
folha da rvore B e as pginas IAM e PFS do heap. Use modo SAMPLED para obter um valor estimado de
compressed_page_count e use modo DETAILED para obter o valor real de compressed_page_count. O modo SAMPLED
retorna estatsticas com base em uma amostra de 1 por cento de todas as pginas no ndice ou heap. Os resultados em
modo SAMPLED devem ser considerados aproximados. Se o ndice ou heap tiver menos que 10.000 pginas, o modo
DETAILED ser usado em vez do SAMPLED.

O modo DETAILED examina todas as pginas e retorna todas as estatsticas.

Os modos so progressivamente mais lentos de LIMITED para DETAILED, porque mais trabalho executado em cada modo.
Para medir rapidamente o tamanho ou o nvel de fragmentao de uma tabela ou ndice, use o modo LIMITED. Ele o mais
rpido e no retornar uma linha para cada nvel no folha na unidade de alocao IN_ROW_DATA do ndice.

Usando funes de sistema para especificar valores de parmetro


Voc pode usar o TransactSQL funes DB_ID https://technet.microsoft.com/ptbr/library/ms186274.aspx e OBJECT_ID
https://technet.microsoft.com/ptbr/library/ms190328.aspx para especificar um valor para o database_id e object_id
parmetros. No entanto, passar valores que no sejam vlidos a essas funes pode causar resultados no intencionais. Por
exemplo, se o banco de dados ou nome de objeto no puder ser encontrado por no existir ou por estar escrito
incorretamente, ambas as funes retornaro NULL. A funo sys.dm_db_index_physical_stats interpreta o NULL como um
valor curinga que especifica todos os bancos de dados ou todos os objetos.

Alm disso, a funo OBJECT_ID processada antes da funo db_index_physical_stats chamada e, portanto, avaliada no
contexto do banco de dados atual, no o banco de dados especificado em database_id. Esse comportamento pode fazer
com que a funo OBJECT_ID retorne um valor NULL; ou, se o nome do objeto existir no contexto do banco de dados atual e
no banco de dados especificado, uma mensagem de erro poder ser exibida. Os exemplos seguintes demonstram esses
resultados no intencionais.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 8/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

USEmaster;
GO
Inthisexample,OBJECT_IDisevaluatedinthecontextofthemasterdatabase.
BecausePerson.Addressdoesnotexistinmaster,thefunctionreturnsNULL.
WhenNULLisspecifiedasanobject_id,allobjectsinthedatabasearereturned.
Thesameresultsarereturnedwhenanobjectthatisnotvalidisspecified.
SELECT*FROMsys.dm_db_index_physical_stats
(DB_ID(N'AdventureWorks'),OBJECT_ID(N'Person.Address'),NULL,NULL,'DETAILED');
GO
Thisexampledemonstratestheresultsofspecifyingavalidobjectname
thatexistsinboththecurrentdatabasecontextand
inthedatabasespecifiedinthedatabase_idparameterofthe
sys.dm_db_index_physical_statsfunction.
AnerrorisreturnedbecausetheIDvaluereturnedbyOBJECT_IDdoesnot
matchtheIDvalueoftheobjectinthespecifieddatabase.
CREATEDATABASETest;
GO
USETest;
GO
CREATESCHEMAPerson;
GO
CREATETablePerson.Address(c1int);
GO
USEAdventureWorks2012;
GO
SELECT*FROMsys.dm_db_index_physical_stats
(DB_ID(N'Test'),OBJECT_ID(N'Person.Address'),NULL,NULL,'DETAILED');
GO
Cleanuptemporarydatabase.
DROPDATABASETest;
GO

Prtica recomendada
Sempre verifique se uma ID vlida retornada ao usar DB_ID ou OBJECT_ID. Por exemplo, ao usar OBJECT_ID, especifique um
nome de trs partes, como OBJECT _ ID(N'AdventureWorks2012.Person.Address') ou teste o valor retornado pelas funes
antes de uslo na funo sys.dm_db_index_physical_stats. Os exemplos A e B a seguir demonstram um modo seguro de
especificar identificaes de banco de dados e objeto.

Detectando a fragmentao
A fragmentao ocorre por meio dos processos de modificaes de dados instrues INSERT, UPDATE e DELETE feitas na
tabela e, portanto, nos ndices definidos na tabela. Como essas modificaes no so distribudas uniformemente entre as
linhas da tabela e os ndices, o preenchimento de cada pgina pode variar com o tempo. Para consultas que examinam parte
dos ndices de uma tabela ou todos eles, esse tipo de fragmentao pode causar leituras de pgina adicionais. Isso impede o
exame paralelo de dados.

O nvel de fragmentao de um ndice ou heap mostrado na coluna avg_fragmentation_in_percent. Para heaps, o valor
representa a fragmentao de extenso do heap. Para ndices, o valor representa a fragmentao lgica do ndice. Ao
contrrio de DBCC SHOWCONTIG, os algoritmos de clculo de fragmentao em ambos os casos consideram o
armazenamento que se estende por vrios arquivos e, por isso, so precisos.

Fragmentao lgica

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 9/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

a porcentagem de pginas com problema nas pginas de folha de um ndice. Uma pgina fora de ordem uma pgina
para a qual a prxima pgina fsica alocada ao ndice no a pgina apontada pelo prximopage ponteiro na pgina de
folha atual.

Fragmentao de extenso

a porcentagem de extenses com problema nas pginas de folha de um heap. Uma extenso com problema aquela para
a qual a extenso que contm a pgina atual de um heap no fisicamente a prxima extenso depois da extenso que
contm a pgina anterior.

O valor de avg_fragmentation_in_percent deve ser o mais prximo possvel de zero para um mximo desempenho. Porm,
valores de 0% a 10% podem ser aceitveis. Podem ser usados todos os mtodos de reduo de fragmentao, como
reconstruir, reorganizar ou recriar, para reduzir esses valores. Para obter mais informaes sobre como analisar o grau de
fragmentao em um ndice, consulte reorganizar e recriar ndices https://technet.microsoft.com/pt
br/library/ms189858.aspx.

Reduzindo a fragmentao em um ndice


Quando um ndice estiver fragmentado de forma que a fragmentao afete o desempenho da consulta, h trs opes para
reduzir a fragmentao:

Descartar e recriar o ndice clusterizado.

Recriar um ndice clusterizado redistribui os dados e resulta em pginas de dados completas. O nvel de
preenchimento pode ser configurado usando a opo FILLFACTOR em CREATE INDEX. As desvantagens desse
mtodo so que o ndice permanece offline durante o ciclo de descarte e recriao e que a operao atmica. Se a
criao de ndice for suspensa, o ndice no ser recriado. Para obter mais informaes, consulte CREATE INDEX
TransactSQL https://technet.microsoft.com/ptbr/library/ms188783.aspx.

Usar ALTER INDEX REORGANIZE, a substituio de DBCC INDEXDEFRAG, para reordenar as pginas de nvel folha do
ndice em uma ordem lgica. Como essa operao online, o ndice permanecer disponvel enquanto a instruo
estiver sendo executada. A operao tambm pode ser interrompida sem perda do trabalho j concludo. A
desvantagem desse mtodo que ele no reorganiza muito bem os dados como uma operao de reconstruo de
ndice e no atualiza as estatsticas.

Usar ALTER INDEX REBUILD, a substituio de DBCC DBREINDEX, para reconstruir o ndice online ou offline. Para
obter mais informaes, consulte ALTER INDEX TransactSQL https://technet.microsoft.com/pt
br/library/ms188388.aspx.

A fragmentao sozinha no uma razo suficiente para reorganizar ou reconstruir um ndice. O efeito principal da
fragmentao que ela reduz a velocidade da taxa de transferncia readahead da pgina durante os exames de ndice. O
resultado tempos de resposta mais lentos. Se a carga de trabalho da consulta em uma tabela ou ndice fragmentado no
envolver exames porque a carga de trabalho composta por pesquisas singleton, a remoo da fragmentao poder no
ter efeito algum. Para obter mais informaes, consulte site da Microsoft http://go.microsoft.com/fwlink/?linkid=31012.

Observao

Executar DBCC SHRINKFILE ou DBCC SHRINKDATABASE poder apresentar fragmentao se um ndice for movido parcial
ou completamente durante a operao de reduo. Assim, se for necessrio executar uma operao de reduo, voc
dever fazer isso antes da remoo da fragmentao.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 10/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

Reduzindo fragmentao em um heap


Para reduzir a extenso da fragmentao de um heap, crie um ndice clusterizado na tabela e descarte o ndice. Isso
redistribui os dados enquanto o ndice clusterizado criado. E tambm otimiza o mximo possvel esse processo, enquanto
considera a distribuio de espao livre disponvel no banco de dados. Quando o ndice clusterizado descartado para a
recriao de um heap, os dados no so movidos e permanecem no mesmo lugar. Para obter informaes sobre como
executar essas operaes, consulte CREATE INDEX https://technet.microsoft.com/ptbr/library/ms188783.aspx e DROP
INDEX https://technet.microsoft.com/ptbr/library/ms176118.aspx.

Cuidado

Criar e descartar um ndice clusterizado em uma tabela recria todos os ndices no clusterizados nessa tabela duas vezes.

Compactando dados de objetos grandes


Por padro, a instruo ALTER INDEX REORGANIZE compacta pginas que contm dados LOB objetos grandes. Como as
pginas LOB no so desalocadas quando vazias, a compactao desses dados poder melhorar o espao em disco se vrios
dados LOB tiverem sido excludos ou se uma coluna LOB foi descartada.

Reorganizar um ndice clusterizado especificado compacta todas as colunas LOB contidas no ndice clusterizado. Reorganizar
um ndice no clusterizado compacta todas as colunas LOB nochave includas no ndice. Quando ALL especificado na
instruo, todos os ndices associados tabela ou exibio especificada so reorganizados. Alm disso, todas as colunas LOB
associadas ao ndice clusterizado, tabela subjacente ou ndice no clusterizado com colunas includas so compactadas.

Avaliando o uso do espao em disco


A coluna avg_page_space_used_in_percent indica que a pgina est cheia. Para se obter um timo uso do espao em disco,
esse valor dever estar perto de 100% para um ndice que no ter muitas inseres aleatrias. Entretanto, um ndice que
tem muitas inseres aleatrias e pginas muito cheias ter um nmero maior de divises de pgina. Isso causa mais
fragmentao. Por isso, para reduzir as divises de pgina, o valor deve ser menor que 100%. A recriao de um ndice com a
opo FILLFACTOR especificada permite que o preenchimento da pgina seja alterado para atender ao padro de consulta
do ndice. Para obter mais informaes sobre o fator de preenchimento, consulte especificar fator de preenchimento para
um ndice https://technet.microsoft.com/ptbr/library/ms177459.aspx. Alm disso, ALTER INDEX REORGANIZE compactar
um ndice tentando preencher pginas para o FILLFACTOR especificado pela ltima vez. Isso aumenta o valor em
avg_space_used_in_percent. Observe que ALTER INDEX REORGANIZE no pode reduzir o preenchimento da pgina. Em vez
disso, o ndice dever ser recriado.

Avaliando fragmentos de ndice


Um fragmento composto de pginas de folha fisicamente consecutivas no mesmo arquivo de uma unidade de alocao.
Um ndice tem pelo menos um fragmento. O mximo de fragmentos que um ndice pode ter igual ao nmero de pginas
no nvel folha do ndice. Fragmentos maiores indicam que menos E/S de disco necessria para ler o mesmo nmero de
pginas. Por isso, quanto maior o valor avg_fragment_size_in_pages, melhor o desempenho de exame de intervalo. Os
valores avg_fragment_size_in_pages e avg_fragmentation_in_percent so inversamente proporcionais entre si. Por isso, a
reconstruo ou a reorganizao de um ndice deve reduzir a quantidade de fragmentao e aumentar o tamanho do
fragmento.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 11/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

Limitaes e restries
No retorna dados para ndices columnstore clusterizados.

Permisses
Requer as seguintes permisses:

Permisso CONTROL no objeto especificado no banco de dados.

Permisso VIEW DATABASE STATE para retornar informaes sobre todos os objetos de banco de dados especificado,
usando o caractere curinga de objeto @object_id= NULL.

Permisso VIEW SERVER STATE para retornar informaes sobre todos os bancos de dados, usando o caractere
curinga de banco de dados @database_id = NULL.

Conceder VIEW DATABASE STATE permite que todos os objetos no banco de dados sejam retornados, independentemente
de qualquer permisso CONTROL negada a objetos especficos.

Negar VIEW DATABASE STATE impede que todos os objetos do banco de dados sejam retornados, independentemente de
qualquer permisso CONTROL concedida a objetos especficos. Alm disso, quando o curinga de banco de dados
@database_id= NULL for especificado, o banco de dados omitido.

Para obter mais informaes, consulte funes TransactSQL e exibies de gerenciamento dinmico.

Exemplos

A. Retornando informaes sobre uma tabela especificada


O exemplo a seguir retorna as estatsticas de tamanho e fragmentao de todos os ndices e parties da tabela
Person.Address . O modo de exame definido como 'LIMITED' para oferecer melhor desempenho e limitar as estatsticas
retornadas. A execuo dessa consulta requer, no mnimo, a permisso CONTROL na tabela Person.Address .

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 12/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

DECLARE@db_idSMALLINT;
DECLARE@object_idINT;

SET@db_id=DB_ID(N'AdventureWorks2012');
SET@object_id=OBJECT_ID(N'AdventureWorks2012.Person.Address');

IF@db_idISNULL
BEGIN;
PRINTN'Invaliddatabase';
END;
ELSEIF@object_idISNULL
BEGIN;
PRINTN'Invalidobject';
END;
ELSE
BEGIN;
SELECT*FROMsys.dm_db_index_physical_stats(@db_id,@object_id,NULL,NULL,'LIMITE
D');
END;
GO

B. Retornando informaes sobre um heap


O exemplo a seguir retorna todas as estatsticas do heap dbo.DatabaseLog no banco de dados AdventureWorks2012. Como
a tabela contm dados LOB, uma linha retornada para a unidade de alocao LOB_DATA , alm da linha retornada para
IN_ROW_ALLOCATION_UNIT que est armazenando as pginas de dados do heap. A execuo dessa consulta requer, no
mnimo, a permisso CONTROL na tabela dbo.DatabaseLog .

DECLARE@db_idSMALLINT;
DECLARE@object_idINT;
SET@db_id=DB_ID(N'AdventureWorks2012');
SET@object_id=OBJECT_ID(N'AdventureWorks2012.dbo.DatabaseLog');
IF@object_idISNULL
BEGIN;
PRINTN'Invalidobject';
END;
ELSE
BEGIN;
SELECT*FROMsys.dm_db_index_physical_stats(@db_id,@object_id,0,NULL,'DETAILED');

END;
GO

C. Retornando informaes de todos os bancos de dados


O exemplo a seguir retorna todas as estatsticas de todas as tabelas e ndices na instncia do SQL Server atravs da
especificao do curinga NULL para todos os parmetros. A execuo desta consulta requer a permisso Exibir estado do
servidor.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 13/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

SELECT*FROMsys.dm_db_index_physical_stats(NULL,NULL,NULL,NULL,NULL);
GO

D. Usando sys.dm_db_index_physical_stats em um script para reconstruir ou reorganizar ndices


O exemplo a seguir reorganiza ou reconstri automaticamente em um banco de dados todas as parties que tm uma
fragmentao mdia de 10%. A execuo desta consulta requer a permisso VIEW DATABASE STATE. Este exemplo especifica
DB_ID como o primeiro parmetro sem especificar um nome de banco de dados. Um erro ser gerado se o banco de dados
atual tiver um nvel de compatibilidade de 80 ou menos. Para resolver o erro, substitua DB_ID() por um nome de banco de
dados vlido. Para obter mais informaes sobre nveis de compatibilidade do banco de dados, consulte alterar o nvel de
compatibilidade do banco de dados TransactSQL https://technet.microsoft.com/ptbr/library/bb510680.aspx.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 14/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

EnsureaUSE<databasename>statementhasbeenexecutedfirst.
SETNOCOUNTON;
DECLARE@objectidint;
DECLARE@indexidint;
DECLARE@partitioncountbigint;
DECLARE@schemanamenvarchar(130);
DECLARE@objectnamenvarchar(130);
DECLARE@indexnamenvarchar(130);
DECLARE@partitionnumbigint;
DECLARE@partitionsbigint;
DECLARE@fragfloat;
DECLARE@commandnvarchar(4000);
Conditionallyselecttablesandindexesfromthesys.dm_db_index_physical_statsfunction

andconvertobjectandindexIDstonames.
SELECT
object_idASobjectid,
index_idASindexid,
partition_numberASpartitionnum,
avg_fragmentation_in_percentASfrag
INTO#work_to_do
FROMsys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'LIMITED')
WHEREavg_fragmentation_in_percent>10.0ANDindex_id>0;

Declarethecursorforthelistofpartitionstobeprocessed.
DECLAREpartitionsCURSORFORSELECT*FROM#work_to_do;

Openthecursor.
OPENpartitions;

Loopthroughthepartitions.
WHILE(1=1)
BEGIN;
FETCHNEXT
FROMpartitions
INTO@objectid,@indexid,@partitionnum,@frag;
IF@@FETCH_STATUS<0BREAK;
SELECT@objectname=QUOTENAME(o.name),@schemaname=QUOTENAME(s.name)
FROMsys.objectsASo
JOINsys.schemasassONs.schema_id=o.schema_id
WHEREo.object_id=@objectid;
SELECT@indexname=QUOTENAME(name)
FROMsys.indexes
WHEREobject_id=@objectidANDindex_id=@indexid;
SELECT@partitioncount=count(*)
FROMsys.partitions
WHEREobject_id=@objectidANDindex_id=@indexid;

30isanarbitrarydecisionpointatwhichtoswitchbetweenreorganizingandrebuilding.

IF@frag<30.0
SET@command=N'ALTERINDEX'+@indexname+N'ON'+@schemaname+N'.'+@ob
jectname+N'REORGANIZE';
IF@frag>=30.0
SET@command=N'ALTERINDEX'+@indexname+N'ON'+@schemaname+N'.'+@ob
jectname+N'REBUILD';
IF@partitioncount>1
https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 15/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

SET@command=@command+N'PARTITION='+CAST(@partitionnumASnvarchar(10));

EXEC(@command);
PRINTN'Executed:'+@command;
END;

Closeanddeallocatethecursor.
CLOSEpartitions;
DEALLOCATEpartitions;

Dropthetemporarytable.
DROPTABLE#work_to_do;
GO

E. Usando sys.dm_db_index_physical_stats para mostrar o nmero de pginas compactadas por


pgina
O exemplo seguinte mostra como exibir e comparar o nmero total de pginas em relao s pginas que so compactadas
por linha e pgina. Estas informaes podem ser usadas para determinar o benefcio que a compactao est fornecendo
para um ndice ou tabela.

SELECTo.name,
ips.partition_number,
ips.index_type_desc,
ips.record_count,ips.avg_record_size_in_bytes,
ips.min_record_size_in_bytes,
ips.max_record_size_in_bytes,
ips.page_count,ips.compressed_page_count
FROMsys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'DETAILED')ips
JOINsys.objectsoono.object_id=ips.object_id
ORDERBYrecord_countDESC;

F. Usando sys.dm_db_index_physical_stats em modo SAMPLED


O exemplo a seguir mostra como o modo SAMPLED retorna um aproximado que diferente dos resultados do modo
DETAILED.

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 16/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

CREATETABLEt3(col1intPRIMARYKEY,col2varchar(500))WITH(DATA_COMPRESSION=PAGE);
GO
BEGINTRAN
DECLARE@idxint=0;
WHILE@idx<1000000
BEGIN
INSERTINTOt3(col1,col2)
VALUES(@idx,
REPLICATE('a',100)+CAST(@idxasvarchar(10))+REPLICATE('a',380))
SET@idx=@idx+1
END
COMMIT;
GO
SELECTpage_count,compressed_page_count,forwarded_record_count,*
FROMsys.dm_db_index_physical_stats(db_id(),
object_id('t3'),null,null,'SAMPLED');
SELECTpage_count,compressed_page_count,forwarded_record_count,*
FROMsys.dm_db_index_physical_stats(db_id(),
object_id('t3'),null,null,'DETAILED');

G. Consultar filas do service broker para a fragmentao do ndice

Aplicase a: do SQL Server 2016 ao SQL Server.

Os exemplos a seguir mostra como consultar filas de agente do servidor de fragmentao.

Usingqueueinternaltablename
select*fromsys.dm_db_index_physical_stats(db_id(),object_id('sys.queue_messages_549576
996'),default,default,default)

Usingqueuenamedirectly
select*fromsys.dm_db_index_physical_stats(db_id(),object_id('ExpenseQueue'),default,
default,default)

Consulte tambm
Exibies de gerenciamento dinmico e funes TransactSQL
ndice exibies de gerenciamento dinmico relacionadas e funes TransactSQL https://technet.microsoft.com/pt
br/library/ms187974.aspx
DM db_index_operational_stats TransactSQL https://technet.microsoft.com/ptbr/library/ms174281.aspx
DM db_index_usage_stats TransactSQL https://technet.microsoft.com/ptbr/library/ms188755.aspx
DM db_partition_stats TransactSQL https://technet.microsoft.com/ptbr/library/ms187737.aspx
sys. allocation_units TransactSQL https://technet.microsoft.com/ptbr/library/ms189792.aspx
Exibies do sistema TransactSQL https://technet.microsoft.com/ptbr/library/ms177862.aspx

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 17/18
07/03/2017 sys.dm_db_index_physical_stats(TransactSQL)

https://technet.microsoft.com/ptbr/library/community/add/ms188917d=printer.aspx
Contribuies da comunidade

2017 Microsoft

https://technet.microsoft.com/ptbr/library/ms188917(d=printer).aspx 18/18

Vous aimerez peut-être aussi