欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Sql Sever性能优化之指定索引

程序员文章站 2022-06-30 12:11:57
背景:生产环境SQL语句查询过慢(数据总量在350万左右),日志中心一直报警 解决过程:分析无果后,求助于公司的DBA,DBA分析后建议在语句中指定索引 解决:在SQL语句中指定索引,效果相当明显,亲测有效 优化前SQL: 优化后SQL(指定使用索引IX_CityId): 注意事项:使用指定索引后, ......

背景:生产环境sql语句查询过慢(数据总量在350万左右),日志中心一直报警

解决过程:分析无果后,求助于公司的dba,dba分析后建议在语句中指定索引

解决:在sql语句中指定索引,效果相当明显,亲测有效

优化前sql:

select  row_number() over ( order by sc.modifytime desc ) as rownumber ,
        sc.commoditycode as channelcommoditycode ,
        sc.outshopcommoditycode as outitemid ,
        sc.isshelf ,
        sc.originprice ,
        sc.saleprice ,
        sc.createby ,
        sc.createtime ,
        sc.modifytime ,
        sc.storecode ,
        sc.shopcommodityid as channelstoremappingid ,
        sc.shopcommodityname as o2ocommodityname ,
        sc.shopcommoditytitle as o2ocommoditytitle ,
        sc.remark as comment ,
        sc.outshopspucode ,
        sc.modifyby ,
        sc.channelcode
from    dbo.channel_shopcommodity as sc with ( nolock )
where   sc.disabled = 0
        and sc.channelcode = '9000000009'
        and sc.cityid = 'eabbe02f-59e0-46e6-90e7-cd8a89dbb98f';

优化后sql(指定使用索引ix_cityid):

select  row_number() over ( order by sc.modifytime desc ) as rownumber ,
        sc.commoditycode as channelcommoditycode ,
        sc.outshopcommoditycode as outitemid ,
        sc.isshelf ,
        sc.originprice ,
        sc.saleprice ,
        sc.createby ,
        sc.createtime ,
        sc.modifytime ,
        sc.storecode ,
        sc.shopcommodityid as channelstoremappingid ,
        sc.shopcommodityname as o2ocommodityname ,
        sc.shopcommoditytitle as o2ocommoditytitle ,
        sc.remark as comment ,
        sc.outshopspucode ,
        sc.modifyby ,
        sc.channelcode
from    dbo.channel_shopcommodity as sc with ( nolock, index= [ix_cityid] )
where   sc.disabled = 0
        and sc.channelcode = '9000000009'
        and sc.cityid = 'eabbe02f-59e0-46e6-90e7-cd8a89dbb98f';

注意事项:使用指定索引后,必须保证where条件中有这个筛选条件,否则索引不生效,查询语句耗时仍然会很长

select  row_number() over ( order by sc.modifytime desc ) as rownumber ,
        sc.commoditycode as channelcommoditycode ,
        sc.outshopcommoditycode as outitemid ,
        sc.isshelf ,
        sc.originprice ,
        sc.saleprice ,
        sc.createby ,
        sc.createtime ,
        sc.modifytime ,
        sc.storecode ,
        sc.shopcommodityid as channelstoremappingid ,
        sc.shopcommodityname as o2ocommodityname ,
        sc.shopcommoditytitle as o2ocommoditytitle ,
        sc.remark as comment ,
        sc.outshopspucode ,
        sc.modifyby ,
        sc.channelcode
from    dbo.channel_shopcommodity as sc with ( nolock, index= [ix_cityid] )
where   sc.disabled = 0
        and sc.channelcode = '9000000009'
        and sc.storecode in ( '10000723' );

以下截图为上面语句的耗时:

Sql Sever性能优化之指定索引

去除指定索引后再次执行

select  row_number() over ( order by sc.modifytime desc ) as rownumber ,
        sc.commoditycode as channelcommoditycode ,
        sc.outshopcommoditycode as outitemid ,
        sc.isshelf ,
        sc.originprice ,
        sc.saleprice ,
        sc.createby ,
        sc.createtime ,
        sc.modifytime ,
        sc.storecode ,
        sc.shopcommodityid as channelstoremappingid ,
        sc.shopcommodityname as o2ocommodityname ,
        sc.shopcommoditytitle as o2ocommoditytitle ,
        sc.remark as comment ,
        sc.outshopspucode ,
        sc.modifyby ,
        sc.channelcode
from    dbo.channel_shopcommodity as sc with ( nolock )
where   sc.disabled = 0
        and sc.channelcode = '9000000009'
        and sc.storecode in ( '10000723' );

Sql Sever性能优化之指定索引

我们会发现耗时明显减少。

由此总结:如果确保某个条件一定会传并且该字段上加了索引,可以使用指定索引提升性能,但是使用指定索引要慎重,避免因为指定索引的where条件不传又引起的查询耗时变长