This is normal. He will not use the index unless the predicate is selective enough to guarantee it.
It seems that the vast majority of records are not NULL, so instead of finding them through a non-clustered index, you have to do a lot of bookmark searches and random I / O to extract the rest of the columns to return, itβs faster and more efficient to just scan the entire cluster index.
You can use FORCESEEK to force the behavior you say want. You will probably find that time and I / O statistics go through the roof compared to clustered index scans.
SET STATISTICS IO ON SELECT * FROM YourTable WITH (FORCESEEK) WHERE YourCol IS NOT NULL
source share