A consulta a seguir gera corretamente o número de buscas, varreduras, etc. Tenho dúvidas sobre como entender algumas linhas na saída. Em algumas linhas de saída da consulta, o nome do índice é mostrado como NULL
e o index_type
é mostrado como HEAP
, e NumOfSeeks
como 0; enquanto, nas mesmas linhas, mostra alguns números diferentes de zero para NumOfScans
e/ou para NumOfLookups
. Pergunta: Como interpretamos essas linhas?
OBSERVAÇÃO : Nenhuma das tabelas possui índice agrupado, portanto, todas as tabelas são HEAP. Porém, na maioria das linhas da saída da consulta a seguir, o nome do índice é exibido (e não é exibido como NULL) e o index_type também é exibido (como NONSLUSTER). Portanto, a pergunta é específica para as linhas de saída descritas acima desta observação.
Ref: sys.dm_db_index_usage_stats .
SELECT OBJECT_NAME(IX.OBJECT_ID) Table_Name
,IX.name AS Index_Name
,IX.type_desc Index_Type
,SUM(PS.[used_page_count]) * 8 IndexSizeKB
,IXUS.user_seeks AS NumOfSeeks
,IXUS.user_scans AS NumOfScans
,IXUS.user_lookups AS NumOfLookups
,IXUS.user_updates AS NumOfUpdates
,IXUS.last_user_seek AS LastSeek
,IXUS.last_user_scan AS LastScan
,IXUS.last_user_lookup AS LastLookup
,IXUS.last_user_update AS LastUpdate
FROM sys.indexes IX
INNER JOIN sys.dm_db_index_usage_stats IXUS ON IXUS.index_id = IX.index_id AND IXUS.OBJECT_ID = IX.OBJECT_ID
INNER JOIN sys.dm_db_partition_stats PS on PS.object_id=IX.object_id
WHERE OBJECTPROPERTY(IX.OBJECT_ID,'IsUserTable') = 1
GROUP BY OBJECT_NAME(IX.OBJECT_ID) ,IX.name ,IX.type_desc ,IXUS.user_seeks ,IXUS.user_scans ,IXUS.user_lookups,IXUS.user_updates ,IXUS.last_user_seek ,IXUS.last_user_scan ,IXUS.last_user_lookup ,IXUS.last_user_update
Heaps são como a tabela base é chamada no SQL Server, quando ela não possui um índice clusterizado. Você é livre para criar índices não clusterizados em um heap.
Os heaps não têm nome
sys.indexes
porque não são índices . A maneira mais comum de descrever heaps é como páginas não ordenadas. Índices são páginas ordenadas logicamente, pelas colunas na chave do índice.Você pode unir de volta
sys.tables
e usarISNULL
para substituir o nome do índice pelo nome da tabela base para heaps.Embora existam casos extremos em que você pode buscar sem índices , as linhas são identificadas em um heap por meio de um identificador interno que não é facilmente exposto aos usuários ou utilizável em uma consulta escrita normalmente como um predicado pesquisável.
Sem um índice clusterizado, a própria tabela é armazenada em uma estrutura de dados heap, como você já observou. Essas linhas
sys.dm_db_index_usage_stats
representam as métricas de quantas vezes o heap foi usado em um plano de consulta, se foi totalmente verificado, etc.Um heap é um conjunto desordenado de dados, por definição, portanto, não é possível procurá-lo com eficiência como um índice clusterizado seria capaz. É por isso que o número de buscas é 0, mas o número de varreduras pode ser maior que 0 (o que, novamente, significa efetivamente que todo o heap foi verificado). Se sua tabela tiver um índice clusterizado, em vez de um heap, os dados serão armazenados em uma B-Tree. Em seguida, você veria uma linha para esse índice clusterizado (com seu nome) em vez da linha para o heap.
A incapacidade de poder ser procurado é geralmente o motivo pelo qual os heaps têm menos desempenho do que as tabelas indexadas em cluster, para a maioria das consultas que não envolvem a maioria dos dados de uma só vez.