Como optimizar el uso del operador OR en TSQL

by | Nov 30, 2019 | Performance, SQL Server | 0 comments

Uno de los grandes problemas que nos podemos encontrar en una consulta TSQL es el uso del operador OR , el mismo es considerado un anti-patron de performance.

En este post veremos como podemos mejorar la performance de una consulta de SQL Server la cual contiene este operador.

Supongamos que tenemos la siguiente consulta:

USE AdventureWorks2017 
GO

SELECT SalesOrderID,
       ProductID, 
       UnitPrice, 
       CarrierTrackingNumber
FROM Sales.SalesOrderDetail 
WHERE ProductID = 709   
OR UnitPrice =  5.7
Si observamos su plan de ejecución nos encontraremos con un Scan sobre el índice clustered que es lo mismo que recorrer toda la tabla.
Ahora vamos a cambiar nuestra consulta usando UNION en lugar del operador OR
SELECT SalesOrderID,
       ProductID, 
       UnitPrice, 
       CarrierTrackingNumber
FROM Sales.SalesOrderDetail 
WHERE ProductID = 709   
UNION
SELECT SalesOrderID,
       ProductID, 
       UnitPrice, 
       CarrierTrackingNumber
FROM Sales.SalesOrderDetail 
WHERE  UnitPrice =  5.7
Si observamos el plan de ejecución veremos que no solo ha cambiado sino que además nos sugiere crear índices
Para mejorar nuestra nueva consulta con el UNION le crearemos los dos siguientes índices
CREATE NONCLUSTERED INDEX [IX_OR]
ON [Sales].[SalesOrderDetail] ([UnitPrice])
INCLUDE ([CarrierTrackingNumber],[ProductID])

CREATE NONCLUSTERED INDEX [IX_OR2]
ON [Sales].[SalesOrderDetail] ([productid])
INCLUDE ([CarrierTrackingNumber],[unitprice])
Ejecutaremos nuestra consulta original con el OR y la nueva con el UNION ya con los índices creados para ver los planes de ejecución y costos
Como se puede observar en los planes de ejecución hay una gran mejora de performance usando el UNION, donde el plan con el OR tiene un costo de “0.63” haciendo un Index Scan vs los “0.023” usando el UNION y con Index Seek.

Acerca del autor

Maximiliano Accotto

Experto en SQL Server y BI

Con mas de 20 años de experiencia y trayectoria trabajando con bases de datos SQL Server y BI.

Fui Microsoft MVP desde el 2005 al 2019 y soy orador frecuente para distintos eventos de Microsoft y comunidades técnicas.

Me especializado en temas de tuning, administracion, performance, diseño y BI en el mundo Microsoft ya sea para ambientes locales como nube.