2010-10-14 13 views
6

Algunos artículos que encontré en Internet compararon ISNULL con COALESCE, por lo que creo que mi pregunta es un poco diferente.COALESCE vs IS NOT NULL rendimiento en la comprobación de cadena vacía

Me pregunto cuál es mejor en términos de rendimiento?

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> ''; 

O

SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> ''; 

Aparte de rendimiento, ¿hay otras preocupaciones que debería considerar al decidir?

EDIT:

estoy usando Teradata.

Respuesta

7

Esta versión es un poco más sargable y permite un índice que se va (potencialmente) utilizaron

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> ''; 

Se puede simplificarse a

SELECT * FROM mytable WHERE mycolumn <> ''; 

La razón por la que digo "poco" y "potencialmente "Es que el predicado de no igualdad bien puede significar que terminas con un escaneo completo de todos modos.

+0

Como una pregunta de seguimiento, si supiéramos que se usará un índice, podríamos optimizar automáticamente el sql (detrás de las escenas) y traducir COALESCE (mycolumn, '') <> '' en mycolumn NO ES NULL y mycolumn <> ''. ¿Estoy teniendo sentido? – Russell

+0

Creo que puede encontrar que NUSI no se puede usar para satisfacer una comparación de desigualdad. Vale la pena mirar el EXPLAIN para confirmar si el optimizador está usando o no el NUSI. –

1

También podría considerar el uso del ANSI_NULL ON setting. Esto filtrará implícitamente valores nulos en una columna donde se emite un argumento de búsqueda. Hacer esto simplifica su consulta, no estoy seguro si lo hace más rápido. Lógicamente, en teoría debería hacerlo, ya que se deben evaluar menos argumentos de filtro y no se utilizan funciones en la cláusula where, que debería permitir una selectividad de índice completa. Como ejemplo, puede volver a factorizar su consulta de esta manera:

SET ANSI_NULLS ON; 
SELECT * FROM mytable WHERE NOT mycolumn = ''; 

Espero que esto ayude.

Cuestiones relacionadas