sys.dm_db_xtp_hash_index_stats (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Estas estadísticas son útiles para comprender y ajustar los recuentos de cubos de índices hash en tablas optimizadas para memoria. También se pueden utilizar para detectar los casos donde la clave de índice tiene muchos duplicados.

Una longitud promedio grande de la cadena indica que se aplica el algoritmo hash a muchas filas para el mismo cubo. Esto puede deberse a que:

  • Si el número de depósitos vacíos es bajo o las longitudes de cadena promedio y máxima son similares, es probable que el número total de depósitos sea demasiado bajo. Esto hace que la aplicación del algoritmo hash a muchas claves de índice distintas dé como resultado el mismo cubo.

  • Si el número de cubos vacíos es alto o la longitud máxima de la cadena es alta con respecto a la longitud media de la cadena, hay dos explicaciones probables. Hay muchas filas con valores de clave de índice duplicados o hay una asimetría en los valores de clave. En cualquier caso, todas las filas con el mismo hash de valor de clave de índice en el mismo cubo, lo que conduce a una longitud de cadena larga en ese cubo.

Las longitudes de cadena largas pueden afectar significativamente al rendimiento de todas las operaciones DML en filas individuales, incluidas SELECT y INSERT. Las longitudes de cadena cortas, junto con un gran número de depósitos vacíos, indican que hay un bucket_count con un valor demasiado alto. Esto reduce el rendimiento de los exámenes de índice.

Advertencia

Esta DMV examina toda la tabla. Por lo tanto, si hay tablas grandes en la base de datos, sys.dm_db_xtp_hash_index_stats puede tardar mucho tiempo.

Para obtener más información, vea Índices hash para tablas optimizadas para memoria.

Nombre de la columna Tipo Descripción
object_id int Identificador del objeto de la tabla primaria.
xtp_object_id bigint Identificador de la tabla optimizada para memoria.
id_de_índice int El identificador de índice.
total_bucket_count bigint El número total de cubos de hash del índice.
empty_bucket_count bigint El número de cubos de hash vacíos del índice.
avg_chain_length bigint La longitud promedio de las cadenas de filas sobre todos los cubos de hash del índice.
max_chain_length bigint La longitud máxima de las cadenas de filas de los cubos de hash.
xtp_object_id bigint Identificador de objeto OLTP en memoria que corresponde a la tabla optimizada para memoria.

Permisos

Requiere el permiso VIEW DATABASE STATE en la base de datos.

Permisos para SQL Server 2022 y versiones posteriores

Requiere el permiso VIEW DATABASE PERFORMANCE STATE en la base de datos.

Ejemplos

A Solución de problemas de recuento de cubos de índice hash

La consulta siguiente se puede usar para solucionar problemas del recuento de cubos de índice hash de una tabla existente. La consulta devuelve estadísticas sobre el porcentaje de cubos vacíos y longitud de cadena para todos los índices hash de las tablas de usuario.

  SELECT  
    QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(h.object_id)) as [table],   
    i.name                   as [index],   
    h.total_bucket_count,  
    h.empty_bucket_count,  
    FLOOR((  
      CAST(h.empty_bucket_count as float) /  
        h.total_bucket_count) * 100)  
                             as [empty_bucket_percent],  
    h.avg_chain_length,   
    h.max_chain_length  
  FROM sys.dm_db_xtp_hash_index_stats as h   
  INNER JOIN sys.indexes as i  
            ON h.object_id = i.object_id  
           AND h.index_id  = i.index_id  
    INNER JOIN sys.memory_optimized_tables_internal_attributes ia ON h.xtp_object_id=ia.xtp_object_id
    INNER JOIN sys.tables t on h.object_id=t.object_id
  WHERE ia.type=1
  ORDER BY [table], [index];  

Para más información sobre cómo interpretar los resultados de esta consulta, consulte Solución de problemas de índices hash para tablas optimizadas para memoria.

B. Estadísticas de índice hash para tablas internas

Algunas características usan tablas internas que usan índices hash, por ejemplo, índices de almacén de columnas en tablas optimizadas para memoria. La consulta siguiente devuelve estadísticas para índices hash en tablas internas vinculadas a tablas de usuario.

  SELECT  
    QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(h.object_id)) as [user_table],
    ia.type_desc as [internal_table_type],
    i.name                   as [index],   
    h.total_bucket_count,  
    h.empty_bucket_count,  
    h.avg_chain_length,   
    h.max_chain_length  
  FROM sys.dm_db_xtp_hash_index_stats as h   
  INNER JOIN sys.indexes as i  
            ON h.object_id = i.object_id  
           AND h.index_id  = i.index_id  
    INNER JOIN sys.memory_optimized_tables_internal_attributes ia ON h.xtp_object_id=ia.xtp_object_id
    INNER JOIN sys.tables t on h.object_id=t.object_id
  WHERE ia.type!=1
  ORDER BY [user_table], [internal_table_type], [index]; 

No se pueden cambiar los recuentos de cubos de índice en tablas internas, por lo que la salida de esta consulta solo debe considerarse informativa. No hace falta realizar ninguna acción.

No se espera que esta consulta devuelva filas a menos que use una característica que use índices hash en tablas internas. La siguiente tabla optimizada para memoria contiene un índice de almacén de columnas. Después de crear esta tabla, verá índices hash en tablas internas.

  CREATE TABLE dbo.table_columnstore
  (
      c1 INT NOT NULL PRIMARY KEY NONCLUSTERED,
      INDEX ix_columnstore CLUSTERED COLUMNSTORE
  ) WITH (MEMORY_OPTIMIZED=ON);