Evaluating IS NULL vs with T-SQL DATETIMEs

Many OR/Ms use an UpdatedAt column and some even use a DeletedAt column for soft deletes. This practice also carries over when using date ranges for controlling notification display (StartDate and EndDate). I’ve often heard many DBAs make the claim that doing a date comparison is faster than checking if the value in a date column IS NULL, so I decided to run some primitive benchmarks to see what I would discover. Admittedly, I’ve also held this belief myself, but I’ve never witnessed any numbers to either prove or disprove the theory. First, I created two tables with two columns each – CreatedAt and DeletedAt. One table allows NULLs in the DeletedAt column, the other does not. Next I filled each table with 1,000,000 random DATETIME values. Each table recieved the exact same DATETIME values in each row and a random number seed was used to determine whether or not the NULL table would have a NULL value or a random DeletedAt value. In my test case, 500843 records had a NULL value. I then ran three separate queries to compare the performance of IS NULL against . Before and after each query, the current time was stored in a variable which was manipulated using a millisecond DATEDIFF to determine the total execution time. [viewcode] src=’http://facility9.com/wp-content/uploads/2008/07/benchmarking.sql’ showsyntax=”no” link=”yes” [/viewcode] The results are as follows:

Run

NULL table, IS NULL

NULL table, <>

NOT NULL table, <>

1

5470

5436

5373

2

5563

5516

5546

3

5936

5750

5466

4

5500

5453

5390

5

5576

5640

5440

AVG

5609

5559

5443

Overall, the <> comparison is faster than an IS NULL comparison, and it is approximately 100 milliseconds faster to perform on a table with no NULLs than on a table with roughly 50% NULL values. Of course, it’s important to take note these are all hot cache hits. I didn’t take the time to reboot my machine and determine the difference running this against a cold cache, however I suspect that the results would still be the same. Testing was performed on a 2.0 GHz Core 2 Duo laptop running Windows XP SP2, SQL Server 2005 Developer Edition (patch level 9.0.3054), with 2 GB of RAM and 7200 RPM drives. It’s an HP Pavilion dv9000t, for those who are interested.