sys.dm_db_xtp_hash_index_stats (Transact-SQL)
Se aplica a: SQL ServerAzure SQL Database Azure SQL Instancia administrada
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);
Contenido relacionado
- Introducción a las tablas con optimización para memoria
- Vistas de administración dinámica de tablas optimizadas para memoria
- Guía de diseño y arquitectura de índices de SQL Server y Azure SQL: Directrices de diseño de índices hash
- Información general y escenarios de uso de OLTP en memoria
- Solución de problemas de índices de hash de tablas optimizadas para memoria
- Optimización del rendimiento mediante tecnologías en memoria en Azure SQL Database
- Optimización del rendimiento mediante tecnologías en memoria en Azure SQL Instancia administrada