Una pregunta sobre SARGability


11

Solo necesito confirmar que entiendo algo correctamente:

Recientemente vi una pregunta SO en la que un usuario publicó una respuesta en Linq como:

from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p

Para aquellos que no están familiarizados con Linq, esperaría que el resultado de esa declaración (no probada con justicia) sea:

SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE() 

Publiqué una respuesta a esto diciendo que la manipulación de fecha y hora debería estar en la variable (en este caso GETDATE()), de modo que la declaración debería reflejar algo como:

SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())

En mi respuesta, los bits de los que ahora no estoy seguro suponen lo siguiente:

  1. Los índices no se utilizarán debido a la manipulación de la columna.
  2. Los planes de consulta serán diferentes en parte debido a lo anterior (no probado, suponiendo que sí)
  3. Debido a lo anterior, la primera consulta en realidad funcionará peor que la segunda.

Mi pregunta:

¿Me he perdido algo en mi razonamiento? ¿Estoy en lo correcto? Por último, ¿algún organismo tiene buenos artículos sobre SARGability?

Respuestas:


6
  1. correcto
  2. no necesariamente: depende de si existe un índice adecuado y de si la CBO decide usarlo. Por ejemplo, si la tabla es pequeña o las estadísticas llevan al optimizador a creer que el filtro será verdadero para un gran porcentaje de los resultados, puede considerar que el costo de un FTS es menor
  3. esto no está garantizado, incluso es posible que la segunda consulta tenga un rendimiento peor, pero su razonamiento es fundamentalmente sólido. Por ejemplo, en un caso límite en el que un FTS en realidad sería más rápido, la CBO puede elegir un escaneo de índice en su lugar según su mejor estimación del costo, que siempre es solo una estimación, por supuesto

Un poco de google apareció esta pregunta SO y este interesante artículo sobre SARGability


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.