2010-09-23 58 views
10

En el pasado he notado un rendimiento terrible al consultar una columna varbinary (max). Comprensible, pero también parece ocurrir cuando se comprueba si es nulo o no, y esperaba que el motor tomara algunos atajos.Estrategias para verificar ISNULL en campos varbinary?

select top 100 * from Files where Content is null 

sospecharía que es lento porque es

  1. Necesidad de tirar de todo el binario, y
  2. No se ha indexado (varbinary no puede ser parte de un índice normal)

This question parece estar en desacuerdo con mi premisa de lentitud aquí, pero parece que tengo problemas de rendimiento con campos binarios una y otra vez.

Una posible solución pensé es hacer una columna calculada que se indexados:

alter table Files 
add ContentLength as ISNULL(DATALENGTH(Content),0) persisted 

CREATE NONCLUSTERED INDEX [IX_Files_ContentLength] ON [dbo].[Files] 
(
    [ContentLength] ASC 
) 

select top 100 * from Files where ContentLength = 0 

¿Eso es una estrategia válida? ¿Qué otras formas hay para consultar de manera eficiente cuando se trata de campos binarios?

Respuesta

8

Creo que es lento porque la columna varbinary no está (y no puede ser) indexada. Por lo tanto, su enfoque para usar una columna calculada (e indexada) es válida.

Sin embargo, usaría ISNULL(DATALENGTH(Content), -1) para que pueda distinguir entre la longitud 0 y NULL. O simplemente use DATALENGTH(Content). Quiero decir, Microsoft SQL Server no es Oracle donde una cadena vacía es igual a NULL.

2

Tuvimos un problema similar al buscar filas donde un valor varbinary no era nulo. Para nosotros la solución era poner al día las estadísticas de la base de datos:

exec sp_updatestats 

Después de hacer esto las consultas corrieron mucho más rápido.