2012-01-19 16 views
10

Estoy usando ISNULL en el servidor MS SQl 2008, ya que mi tabla es demasiado grande, si el uso de ISNULL puede causar algo en el rendimiento?¿Existe algún problema de rendimiento al usar ISNULL() en SQL Server?

Gracias de antemano

+4

¿No puedes probar y ver? –

+1

Depende de muchas cosas, como siempre. Cómo lo usa, dónde lo usa, cuál es su consulta. Más detalles pueden ayudar. – Paddy

+0

@SergioTulentsev Estoy trabajando en un proyecto de mejora. Así que hemos agregado algunos nuevos colomns a tbls. Eso será nulo. Los datos que están disponibles para el desarrollo son pocos. La base de datos de producción es muy grande. No puedo acceder a eso. – kbvishnu

Respuesta

8

Si hay que usarla, entonces cualquier diferencia entre ISNULL y alternativas como COALESCE o caja son minúsculos. No se preocupe

Cualquier diferencia proviene de cómo se manejan los tipos de datos. COALESCE/CASE puede agregar conversiones de tipos de datos implícitos, mientras que ISNULL tiene reglas más simples.

Editar

ISNULL en la lista SELECT para suprimir NULLS es trivial. El trabajo principal se realizará en el procesamiento de filas y datos. Un ISNULL adicional no será medible: No lo haga optimise prematurely

+0

puede u pls consideran los comentarios – kbvishnu

+1

Según otra respuesta a esta entrada, la función ISNULL tiene un perfil de rendimiento significativamente diferente cuando utilizado en un SELECT vs cuando se usa en una cláusula WHERE o JOIN. Mi experiencia confirma que este es el caso. –

+0

@DavidAlpert de acuerdo. Es fácil hacer un mal uso de – gbn

9

Sí, puede. Para optimizador es reescribir mejor la consulta (si es posible) para formar

(Field = @x OR @x IS NULL) 

Debido a que el uso de funciones en algunos casos impide optimizador de utilizar las estadísticas y, a veces forzado conversiones de tipos de datos implícitas

+0

puede u pls c d comentarios – kbvishnu

+0

mi consulta: - seleccione oldcol, isnull (newcol, 0) 'a' de tbl. Entonces aquí estoy usando ISNULL. ¿Puede explicar poco basado en su consulta? gracias – kbvishnu

+2

En su caso, el efecto de usar ISNULL es insignificante –

0

Como ya se ha mencionado que depende sobre cómo y dónde lo está usando en su consulta. Puede ser que desee mostrar la forma en que lo está utilizando en su consulta.

También le recomiendo que ir sobre esto - What makes a SQL statement sargable?

35

ISNULL() en la cláusula-select tiene una influencia insignificante en el rendimiento. En la cláusula where, por otro lado, puede tener un gran impacto en el rendimiento, ya que impide que el optimizador use un índice en esa columna.

where isnull(col1, 0) = 0 -- unable to use index, because every 
          -- row has to be evaluated 

where col1 = isnull(@myVar, 0) -- index will be used, since isnull(@myVar, 0) 
           -- returns the same static value for every row and 
           -- not every row has to be evaluated by the function. 

Por lo tanto, cuando se utiliza isnull() en una cláusula where, evaluar si se impide que el optimizador de consultas mediante un índice. Si es así, considere la posibilidad de crear una columna calculada con el resultado if isnull (col1, 0) e indexe la columna calculada y úsela en su cláusula where.

+0

Tenga en cuenta que estas dos condiciones no dan los mismos resultados. – Atario

1

Evite utilizar isNull en la cláusula where. Consulte This article.

+0

Hola, esta pregunta ya tiene una respuesta aceptada. Esta es una buena información, pero sería mejor como comentario :) – landons

+0

No entiendo ese artículo. Ya está mirando la columna desnuda. Isnull (@someVar, 0) no debería ser costoso. Isnull (someColumn, 0) podría ser costoso si eso hace que el índice no se use. –

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ reseña/mensajes de baja calidad/18966014) – derloopkat

1

sí, hay un problema de rendimiento que yo sepa, en SQL Server 2012. Estudio

El problema es bastante evidente cuando utilicé ISNULL en combinación con OVER. Después de optimizar (es decir, poniendo ISNULL en la sub consulta, estoy usando OVER encendido), el tiempo de ejecución se ha reducido de (estimado) 25.2 horas a 102 segundos.

Supongo que ISNULL está bien cuando lo ejecuta en una columna completa (por ejemplo, en un simple-ol 'SELECT). Pero cuando lo ejecuta con OVER se lo llama de nuevo cada vez, lo que reduce el rendimiento.

No está listo para profundizar más. Simplemente ponerlo aquí para la referencia de los demás.

Cuestiones relacionadas