Menu

Optimización de consultas Parte 2/2

Diciembre 9, 2012 - SQL Server

Introducción

Siguiendo con la optimización de consultas veremos como realizar una consulta con múltiples parámetros y que dado el caso devuelva todos los registros.

Requisitos

Para el ejemplo utilice SQL Server 2012, sin embargo por tratarse de lógica booleana es aplicable a cualquier base de datos.

Manos a la obra!

La ultima vez revisamos que esta consulta podía traer todos los datos y a su vez también filtrarlos por un parámetro en especifico.

SELECT
  *
  FROM
  [Production].[Product]
  WHERE
  (@ProductModelID IS NULL)
  OR (ProductModelID = @ProductModelID)

Pero puede ser optimizada aun mas ya que los OR son operadores ineficientes. Ya que recordamos tenemos entonces la consulta base:

SELECT
  *
  FROM
  [Production].[Product]

Y podemos mostrar solo cada clausula que vamos agregando en el WHERE.

Para eliminar los OR podemos hacer uso de la función COALESCE o ISNULL y un BETWEEN de la siguiente forma:

WHERE
  ProductModelID BETWEEN ISNULL(@ProductModelID, 0) AND ISNULL(@ProductModelID, 99999999)

El mínimo y máximo pueden variar, pero aquí les muestro un ejemplo de como funciona y determinando que tipo de dato se use (tinyint, smallint, int, etc.) se puede parametrizar el mínimo y máximo del ProductModelID. En caso de que pueda ser negativo también se puede incluir.

Para el caso de las fechas se puede usar:

AND SellStartDate BETWEEN ISNULL(@SellStartDate, '1/1/1900') AND ISNULL(@SellStartDate, '12/31/2999')

No creo que ningún producto se haya vendido el 1/1/1900 así que nos sirve perfectamente de comodín al igual que el 12/31/2999

Para el caso de comparación de cadenas podemos usar:

AND Name LIKE COALESCE(@Name, '%')

La consulta final quedaria asi:

DECLARE @ProductModelID INT
  DECLARE @SellStartDate DATETIME
  DECLARE @Name VARCHAR(100)
  --SET @ProductModelID = 6

SELECT
  *
  FROM
  [Production].[Product]
  WHERE
  ProductModelID BETWEEN ISNULL(@ProductModelID, 0) AND ISNULL(@ProductModelID, 99999999)
  AND SellStartDate BETWEEN ISNULL(@SellStartDate, '1/1/1900') AND ISNULL(@SellStartDate, '12/31/2999')
  AND Name LIKE COALESCE(@Name, '%')

Bueno, espero que haya aprendido como optimizar sus consultas de esta forma, realmente resultan muy útiles. Nos veremos en la próxima y como siempre…

Happy coding!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *