2010-09-23 7 views
10

In passato ho notato prestazioni terribili durante l'interrogazione di una colonna varbinary (max). Comprensibile, ma sembra anche che accada quando si verifica se è nullo o no, e speravo che il motore avrebbe preso alcune scorciatoie.Strategie per il controllo di ISNULL sui campi varbinary?

select top 100 * from Files where Content is null 

io sospetto che è lento perché è

  1. Dovendo tirare l'intero binario, e
  2. non è indicizzato (varbinary non può essere parte di un indice normale)

This question sembra essere in disaccordo con la mia premessa di lentezza qui, ma mi sembra di avere problemi di prestazioni con i campi binari più e più volte.

Una soluzione possibile ho pensato è di fare una colonna calcolata che è indicizzato:

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 

È che una strategia valida? Quali altri modi ci sono per interrogare in modo efficiente quando sono coinvolti i campi binari?

risposta

8

Penso che sia lento perché la colonna varbinary non è (e non può essere) indicizzata. Pertanto, il tuo approccio all'uso di una colonna calcolata (e indicizzata) è valido.

Tuttavia, vorrei utilizzare ISNULL(DATALENGTH(Content), -1) invece, in modo da poter distinguere tra la lunghezza 0 e NULL. O semplicemente usa DATALENGTH(Content). Voglio dire, Microsoft SQL Server non è Oracle dove una stringa vuota è uguale a NULL.

2

Abbiamo riscontrato un problema simile durante la ricerca di righe in cui un valore varbinary non era nullo. Per noi la soluzione era aggiornare le statistiche per il database:

exec sp_updatestats 

Dopo aver fatto questo, le query venivano eseguite molto più velocemente.