Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strategies for checking ISNULL on varbinary fields?

In the past I've noted terrible performance when querying a varbinary(max) column. Understandable, but it also seems to happen when checking if it's null or not, and I was hoping the engine would instead take some shortcuts.

select top 100 * from Files where Content is null

I would suspect that it's slow because it's

  1. Needing to pull the whole binary out, and
  2. It's not indexed (varbinary can't be part of a normal index)

This question seems to disagree with my premise of slowness here, but I seem to have performance problems with binary fields time and time again.

One possible solution I thought of is to make a computed column that is indexed:

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

Is that a valid strategy? What other ways are there to efficiently query when binary fields are involved?

like image 297
Gavin Avatar asked Sep 23 '10 04:09

Gavin


People also ask

What is Isnull () operator?

Definition and Usage. The ISNULL() function returns a specified value if the expression is NULL. If the expression is NOT NULL, this function returns the expression.

Can we use Isnull in where clause?

We use IS NULL to identify NULL values in a table. For example, if we want to identify records in the employee table with NULL values in the Salary column, we can use IS NULL in where clause.

When would you use Varbinary data type?

The VARBINARY data type holds variable-length binary data. Use this type when the data is expected to vary in size. The maximum size for VARBINARY is 8,000 bytes.


2 Answers

I think it's slow because the varbinary column is not (and can't be) indexed. Therefore, your approach to use a computed (and indexed) column is valid.

However, I would use ISNULL(DATALENGTH(Content), -1) instead, so that you can distinguish between length 0 and NULL. Or just use DATALENGTH(Content). I mean, Microsoft SQL Server is not Oracle where an empty string is the same as NULL.

like image 137
Thomas Mueller Avatar answered Sep 18 '22 12:09

Thomas Mueller


We had a similar problem when looking for rows where a varbinary value was not null. For us the solution was to update the statistics for the database:

exec sp_updatestats

After doing this the queries ran much faster.

like image 26
Geoff Hardy Avatar answered Sep 18 '22 12:09

Geoff Hardy