Estoy comparando dos consultas en SQL Server 2012. El objetivo es utilizar toda la información pertinente disponible del optimizador de consultas al elegir la mejor consulta. Ambas consultas producen los mismos resultados; El pedido máximo para todos los clientes.
La eliminación del grupo de búferes se realizó antes de ejecutar cada consulta con FREEPROCCACHE y DROPCLEANBUFFERS
Usando la información proporcionada a continuación, ¿qué consulta es la mejor opción?
-- Query 1 - return the maximum order id for a customer
SELECT orderid, custid
FROM Sales.Orders AS O1
WHERE orderid = (SELECT MAX(O2.orderid)
FROM Sales.Orders AS O2
WHERE O2.custid = O1.custid);
-- Query 2 - return the maximum order id for a customer
SELECT MAX(orderid), custid
FROM Sales.Orders AS O1
group by custid
order by custid
TIEMPO ESTADÍSTICO
Consulta 1 TIEMPO ESTADÍSTICO: tiempo de CPU = 0 ms, tiempo transcurrido = 24 ms
Consulta 2 ESTADÍSTICAS TIEMPO: tiempo de CPU = 0 ms, tiempo transcurrido = 23 ms
ESTADÍSTICAS IO
Consulta 1 ESTADÍSTICAS IO: Tabla 'Pedidos'. Cuenta de escaneo 1, lecturas lógicas 5, lecturas físicas 2, lecturas de lectura anticipada 0, lecturas lógicas lob 0, lecturas físicas lob 0, lecturas de lectura lob 0.
Consulta 2 ESTADÍSTICAS IO: Tabla 'Pedidos'. Recuento de escaneo 1, lecturas lógicas 4, lecturas físicas 1, lecturas anticipadas 8, lecturas lógicas lob 0, lecturas físicas lob 0, lecturas anticipadas lob 0.
Planes de ejecucion
Seleccionar propiedades Consulta 1
Seleccionar propiedades Consulta 2
Conclusiones:
Consulta 1
- Lote costo 48%
- Lecturas lógicas 5
- Lecturas físicas 2
- Lecturas anticipadas Lecturas: 0
- Tiempo de CPU: 0 ms
- Tiempo transcurrido 24 ms
- Costo estimado del subárbol: 0.0050276
- Compilar CPU: 2
- Memoria de compilación: 384
- Tiempo de compilación: 2
Consulta 2
- Lote costo 52%
- Lecturas lógicas 4
- Lecturas físicas 1
- Lecturas anticipadas Lecturas: 8
- Tiempo de CPU 0
- Tiempo transcurrido 23 ms
- Costo estimado del subárbol: 0.0054782
- Compilar CPU: 0
- Memoria de compilación: 192
- Tiempo de compilación: 0
Personalmente, aunque la consulta 2 tiene un costo de lote más alto de acuerdo con el plan gráfico, creo que es más eficiente que la consulta 1. Esto debido a que la consulta 2 requiere menos lecturas lógicas, tiene un tiempo transcurrido ligeramente menor, los valores de compilecpu, compilememory y compiletime son inferior. las lecturas de lectura anticipada son 8 para la consulta 2 y 0 para la consulta 1.
Actualización 12:03
Definición de índice agrupado
ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[orderid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Índice no agrupado idx_nc_custid
CREATE NONCLUSTERED INDEX [idx_nc_custid] ON [Sales].[Orders]
(
[custid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO