November 27, 2013 at 5:01 pm
Hi
I have a query like that
select c.client_group, s.product_id, count(*) as q
from Sales s
inner join Client c on c.client_id= s.client_id
group by c.client_id, s.product_id
the Sales.pk (clustered index) consist of client_id and product_id -- 1.000.000 rows
the Client.pk (clustered index) consist of client_id -- 20.000 rows
very simple, but it was VERY slow
when I added a non clustered index Client.ix ( identical to the clustered index )
the query turned incredibly fast
what could be the reason?
thanks
November 28, 2013 at 12:25 am
Actual query plans of both situations might be nice to troubleshoot.
Need an answer? No, you need a question
My blog at https://sqlkover.com.
MCSE Business Intelligence - Microsoft Data Platform MVP
November 28, 2013 at 8:41 am
thanks Koen
I was looking for "general reasons"
If you see the query plans now, they are almost identical
Now, with or without the index, the engine doesn't try to use it
I don't know why the query was so slow
I suspect about "with recompute" improved it
the next time I will post the problem
just when it appears
:doze:
thanks anyway
November 29, 2013 at 10:30 am
keyser soze-308506 (11/27/2013)
HiI have a query like that
select c.client_group, s.product_id, count(*) as q
from Sales s
inner join Client c on c.client_id= s.client_id
group by c.client_id, s.product_id
the Sales.pk (clustered index) consist of client_id and product_id -- 1.000.000 rows
the Client.pk (clustered index) consist of client_id -- 20.000 rows
very simple, but it was VERY slow
when I added a non clustered index Client.ix ( identical to the clustered index )
the query turned incredibly fast
what could be the reason?
thanks
To do the join, SQL must fully scan the index containing the Client.ix. When that is the clustered index, SQL must scan the entire table, since a clus index is the table itself. When it is a nonclustered index, SQL scans the nonclustered index instead of the entire table. If the rows are wide, then scanning the nonclus index will likely be far fewer pages than scanning the entire table, thus it runs faster.
SQL DBA,SQL Server MVP(07, 08, 09) "It's a dog-eat-dog world, and I'm wearing Milk-Bone underwear." "Norm", on "Cheers". Also from "Cheers", from "Carla": "You need to know 3 things about Tortelli men: Tortelli men draw women like flies; Tortelli men treat women like flies; Tortelli men's brains are in their flies".
November 29, 2013 at 11:33 am
keyser soze-308506 (11/27/2013)
HiI have a query like that
select c.client_group, s.product_id, count(*) as q
from Sales s
inner join Client c on c.client_id= s.client_id
group by c.client_id, s.product_id
That code won't actually work at all. You have the non-aggregated c.client_group in the SELECT list and it's not included in the GROUP BY. You also have c.client_id in the GROUP BY and it's not included as a non-aggregate in the SELECT list.
Please post the actual query that you're having problems with. Also, please see the second link in my signature line below under "Helpful Links" to get help with performance problems.
--Jeff Moden
Change is inevitable... Change for the better is not.
Viewing 5 posts - 1 through 4 (of 4 total)
You must be logged in to reply to this topic. Login to reply