May 5, 2009 at 2:06 am
GilaMonster (5/5/2009)
Jeff Moden (5/4/2009)
I'm not sure how creating a filtered index on the Department column can be considered as a covering index on this query... it's still just an index on the Department column even though there's a filter on a column that happens to be used in the query.From Books Online: (http://msdn.microsoft.com/en-us/library/cc280372.aspx)
In some cases, a filtered index covers the query without including the columns in the filtered index expression as key or included columns in the filtered index definition. The following guidelines explain when a column in the filtered index expression should be a key or included column in the filtered index definition.
A column in the filtered index expression does not need to be a key or included column in the filtered index definition if the filtered index expression is equivalent to the query predicate and the query does not return the column in the filtered index expression with the query results. For example, FIBillOfMaterialsWithEndDate covers the following query because the query predicate is equivalent to the filter expression, and EndDate is not returned with the query results. FIBillOfMaterialsWithEndDate does not need EndDate as a key or included column in the filtered index definition.
CREATE NONCLUSTERED INDEX FIBillOfMaterialsWithEndDate
ON Production.BillOfMaterials (ComponentID, StartDate)
WHERE EndDate IS NOT NULL;
SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL;
GO
That is precisely the case here. The managerID is only used in the where clause and the filtered index expression is equivalent to the query predicate.
Predicate IS NOT NULL works fine, but IS NULL will generate a inner join and key lookup alone.
May 5, 2009 at 5:59 pm
Thanks for the info folks. Learned something new which is always a pleasure. I was just going for the "old doctor" trick. You know the one... go to the doctor and say "When I hold my arm over my head like this, it hurts real bad". Doctor always says, "So don't do that and it won't hurt." 😉
--Jeff Moden
Change is inevitable... Change for the better is not.
May 6, 2009 at 2:11 am
No worries Jeff. By digging up proof for you I learned some stuff about filtered indexes too. 😀
Sheng, I chatted with some friends about this. It appears (though I haven't tested) that on SP1 the optimiser does pick the filtered indexes without the hint, but there's still that odd key lookup on the IS NULL version. We've concluded that it's either a bug, a limitation that should be documented, or the documentation is wrong.
I'll be logging this on Connect this week.
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
May 6, 2009 at 3:31 am
Thank you, everyone.
A key lookup only output the key column is fairly odd. Without asking the developers of Microsoft, I've no idea on this:-) But if we noticed the something happened is not what we want, we can hack it by using the "old doctor hack":-D
May 6, 2009 at 3:53 am
It must be a bug.
I've tested in on SQL2008 SP1. (10.0.2531.0 (Intel X86) )
It gets even worse if you explicitly use the ID column in the filtered index definition.
(tested as well usage in the key-part as usage as include column)
Why ? Because in that case one should be 100% sure it will be a index only query (not relying on the auto include of a unique(ified) clustering index key).
The execution plans still shows a key lookup on the clustering index.
edited: Thank you Gail for taking this to Connect. (please provide the url)
Johan
Learn to play, play to learn !
Dont drive faster than your guardian angel can fly ...
but keeping both feet on the ground wont get you anywhere :w00t:
- How to post Performance Problems
- How to post data/code to get the best help[/url]
- How to prevent a sore throat after hours of presenting ppt
press F1 for solution, press shift+F1 for urgent solution 😀
Need a bit of Powershell? How about this
Who am I ? Sometimes this is me but most of the time this is me
May 6, 2009 at 6:18 am
ALZDBA (5/6/2009)
It must be a bug.I've tested in on SQL2008 SP1. (10.0.2531.0 (Intel X86) )
It gets even worse if you explicitly use the ID column in the filtered index definition.
(tested as well usage in the key-part as usage as include column)
Thank you. That was the one thing that I still wanted to test.
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
May 21, 2009 at 3:57 am
http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=454744
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
May 23, 2009 at 5:40 am
Thank you for the feedback.
Johan
Learn to play, play to learn !
Dont drive faster than your guardian angel can fly ...
but keeping both feet on the ground wont get you anywhere :w00t:
- How to post Performance Problems
- How to post data/code to get the best help[/url]
- How to prevent a sore throat after hours of presenting ppt
press F1 for solution, press shift+F1 for urgent solution 😀
Need a bit of Powershell? How about this
Who am I ? Sometimes this is me but most of the time this is me
March 2, 2010 at 10:52 am
I know this post has not been updated for a while,
but wanted to know if there was an hotfix/workaround (not the docy-style :-))
I created a few of the IS NULL filtered indexes and while putting together a sql the execution plan would only take the indexes if I force it with hints.
However your descripted phenomenon only happend to me if I did NOT put the column which is "IS NULL" into the included columns of the filtered index.
Additionally I must say, that the filtered colum is not part of the resultset, it is just in the join (ON)-clause.
So, am I just lucky or has there been an fix and if it was fixed, why does the optimizer not pick my index without hint?
Microsoft SQL Server Enterprise Edition SP1 (64-bit) (10.0.2531.0)
Windows Server 2008 SP2 (64-bit) (6002)
Cheers,
Mitch
March 2, 2010 at 11:39 am
It was supposed to have been fixed in SP2, but honestly, I haven't even thought about this issue for a while, I haven't tested it.
Putting the column in the include would remove the (incorrect) use of a key lookup, as the column would be in the index.
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
November 7, 2011 at 5:31 pm
I'm on SQL 2008 R2 (10.50.1600) and I just created a filtered index with "MyColumn IS NULL" as the filter and my queries appear to be using the index when they should, so I think it's fixed.
November 7, 2011 at 8:02 pm
Alex Bransky (11/7/2011)
I'm on SQL 2008 R2 (10.50.1600) and I just created a filtered index with "MyColumn IS NULL" as the filter and my queries appear to be using the index when they should, so I think it's fixed.
The bug is the unnecessary key lookup with a predicate that matches the filter condition.
This limitation still exists on 10.50.2772 and 11.0.1440 (2012 CTP 3).
Paul White
SQLPerformance.com
SQLkiwi blog
@SQL_Kiwi
November 8, 2011 at 1:58 am
SQL Kiwi (11/7/2011)
Alex Bransky (11/7/2011)
I'm on SQL 2008 R2 (10.50.1600) and I just created a filtered index with "MyColumn IS NULL" as the filter and my queries appear to be using the index when they should, so I think it's fixed.The bug is the unnecessary key lookup with a predicate that matches the filter condition.
This limitation still exists on 10.50.2772 and 11.0.1440 (2012 CTP 3).
So much for 'fixed in the next version of SQL'... 🙁
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
November 8, 2011 at 2:14 am
GilaMonster (11/8/2011)
So much for 'fixed in the next version of SQL'... 🙁
The comments on the Connect item are contradictory, but the most recent one says:
"This is now an active DCR for a future release of SQL Server."
...which sounds a bit like "We'll get to it one day, maybe". :ermm:
Paul White
SQLPerformance.com
SQLkiwi blog
@SQL_Kiwi
November 8, 2011 at 2:23 am
SQL Kiwi (11/8/2011)
GilaMonster (11/8/2011)
So much for 'fixed in the next version of SQL'... 🙁The comments on the Connect item are contradictory, but the most recent one says:
"This is now an active DCR for a future release of SQL Server."
...which sounds a bit like "We'll get to it one day, maybe". :ermm:
I got a mail direct from the dev team that said 'fixed in the next version'. Was sent just before they closed it 'Won't fix'. Time to reopen the item I think.
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
Viewing 15 posts - 16 through 30 (of 33 total)
You must be logged in to reply to this topic. Login to reply