Cuando se trata de optimizar el rendimiento de las consultas en SQL Server, una de las cosas más fáciles de arreglar son las búsquedas de clave o las búsquedas de RID. Estas operaciones ocurren cuando el optimizador de consultas realiza una búsqueda de índice en una tabla específica, pero el índice no tiene todas las columnas necesarias para completar el conjunto de resultados. Como resultado, SQL Server se ve obligado a volver al índice agrupado utilizando la clave primaria o un identificador de fila para recuperar las columnas restantes que necesita para satisfacer la solicitud.
Las búsquedas de clave y las búsquedas de RID pueden ser muy costosas y pueden resultar en un impacto significativo en el rendimiento en términos de E/S y uso de CPU. Imagina una consulta que se ejecuta miles de veces por minuto e incluye una o más de estas búsquedas. Esto puede llevar a una sobrecarga significativa y afectar negativamente el rendimiento general del motor.
Echemos un vistazo a un ejemplo:
SELECT [SalesOrderID],[CarrierTrackingNumber],[OrderQty],[ProductID],
[UnitPrice],[ModifiedDate]
FROM [AdventureWorks2014].[Sales].[SalesOrderDetail]
WHERE [ModifiedDate] > '2014/01/01' AND [ProductID] = 772
En este ejemplo, el costo del operador de búsqueda de clave es del 99% de la consulta. El optimizador de consultas realizó una búsqueda de índice en el índice IX_SalesOrderDetail_ProductID, que es muy efectivo. Sin embargo, este índice no tiene todas las columnas necesarias para satisfacer la consulta. Como resultado, el optimizador tuvo que ir al índice agrupado PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID para recuperar las columnas adicionales.
La buena noticia es que las búsquedas de clave y las búsquedas de RID son relativamente fáciles de arreglar. Al hacer una pequeña modificación al índice no agrupado IX_SalesOrderDetail_ProductID, podemos cambiar el plan de consulta de una búsqueda de índice y una búsqueda de clave a solo una búsqueda de índice.
CREATE NONCLUSTERED INDEX [IX_SalesOrderDetail_ProductID]
ON [Sales].[SalesOrderDetail]([ProductID] ASC)
INCLUDE ([CarrierTrackingNumber],[UnitPrice], [ModifiedDate], [OrderQty])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
Al recrear el índice y agregar las columnas necesarias como columnas incluidas, ahora tenemos un plan de consulta más eficiente con solo una búsqueda de índice.
Las búsquedas de clave y las búsquedas de RID pueden causar dolores de cabeza en el rendimiento, especialmente para consultas que se ejecutan con frecuencia. Es importante identificar y solucionar estos problemas de manera proactiva para optimizar el rendimiento de su entorno de SQL Server.
Para obtener más información sobre cómo localizar estas búsquedas en la caché de planes, asegúrese de consultar el blog de Jonathan Kehayias.