Me pregunto si existe alguna forma inteligente de reescribir la siguiente consulta para que el optimizador utilice los índices en las columnas.Cómo optimizar el uso de la cláusula "O" cuando se usa con parámetros (SQL Server 2008)
Create Procedure select_Proc1
@Key1 int=0,
@Key2 int=0
As
BEGIN
Select key3
From Or_Table
Where (@key1 =0 OR Key1 [email protected]) AND
(@key2 =0 OR Key2 [email protected])
END
GO
A pesar de que las columnas en las cláusulas WHERE están cubiertos por índices, SQL Server no puede utilizar estos índices. Esto plantea la pregunta de si algo está "bloqueando" el uso de los índices. La respuesta a esta pregunta es sí: los culpables son los parámetros y la condición "O". Los parámetros no están cubiertos por índices, lo que significa que SQL Server no puede usar ninguno de los índices para evaluar "@ key1 = 0" (una condición que también se aplica a @ key2 = 0). Efectivamente, esto significa que SQL Server no puede usar índices para evaluar la cláusula "@ key1 = 0 OR Key1 = @ key1" (como la cláusula "OR" es la unión de filas cubiertas por ambas condiciones). El mismo principio se aplica a la otra cláusula (re. Key2) también. Esto lleva a SQL Server a concluir que no se pueden usar índices para extraer las filas, dejando que SQL Server utilice el siguiente mejor enfoque: un análisis de índice agrupado
Como ve, el optimizador de SQL no usará índices en las columnas si los predicados son "OR" ed en la cláusula WHERE. Una solución para este problema es separar las consultas con la cláusula IF para todas las combinaciones posibles de parámetros.
Lea este breve artículo para obtener una mejor vista del problema: http://www.sql-server-performance.com/articles/per/optimize_or_clause_p1.aspx
Ahora mi pregunta es, ¿qué debemos hacer si las posibles combinaciones son más que sólo tres o cuatro? Escribir una consulta separada para cada combinación no parece una solución racional. ¿Hay alguna otra solución para este problema?
enfoque interesante, voy a tener que recordarlo. Supongo que también se aplicaría a otros RDBMS como Oracle, donde 'OR 'es terriblemente ineficiente. – Lucero
¿Es esta la única manera? ¿Qué pasa si la consulta es más complicada (más cláusulas de OR involucradas) – Meysam