简体   繁体   中英

Performance Tuning SQL

I have the following sql. When I check the execution plan of this query we observe an index scan. How do I replace it with index seek. I have non clustered index on IdDeleted column. 执行计划

SELECT Cast(Format(Sum(COALESCE(InstalledSubtotal, 0)), 'F') AS MONEY) AS TotalSoldNet,
       BP.BoundProjectId                                               AS ProjectId
FROM   BoundProducts BP
WHERE  BP.IsDeleted=0 or BP.IsDeleted is null
GROUP  BY BP.BoundProjectId

I tried like this and got index seek, but the result was wrong.

SELECT Cast(Format(Sum(COALESCE(InstalledSubtotal, 0)), 'F') AS MONEY) AS TotalSoldNet,
       BP.BoundProjectId                                               AS ProjectId
FROM   BoundProducts BP
WHERE  BP.IsDeleted=0
GROUP  BY BP.BoundProjectId 

Can anyone kindly suggest me to get the right result set with index seek.

I mean how to I replace (BP.IsDeleted=0 or BP.IsDeleted is null) condition to make use of index seek.

Edit, added row counts from comments of one of the answers:

null: 254962 rows
0:    392002 rows
1:     50211 rows

You're not getting an index seek because you're fetching almost 93% of the rows in the table and in that kind of scenario, just scanning the whole index is faster and cheaper to do.

If you have performance issues, you should look into removing format() -function, especially if the query returns a lot of rows. Read more from this blog post

Other option might be to create an indexed view and pre-aggregate your data. This of course adds an overhead to update / insert operations, so consider that only if this is done really often vs. how often the table is updated.

have you tried a UNION ALL? select ... Where isdeleted = 0 UNION ALL select ... Where isdeleted is null

Or you can add an Query hint (index= [indexname])

also be aware that the cardinality will determine if SQL uses a seek or a scan - seeks are quicker but can require key lookups if the index doesnt cover all the columns required. A good rule of thumb is that if the query will return more than 5% of the table then SQL will prefer a scan.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM