经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库运维 » MS SQL Server » 查看文章
Sql Sever性能优化之指定索引
来源:cnblogs  作者:码农小周  时间:2018/11/2 9:06:06  对本文有异议

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

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

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

优化前SQL:

  1. SELECT ROW_NUMBER() OVER ( ORDER BY sc.ModifyTime DESC ) AS RowNumber ,
  2. sc.CommodityCode AS ChannelCommodityCode ,
  3. sc.OutShopCommodityCode AS OutItemId ,
  4. sc.IsShelf ,
  5. sc.OriginPrice ,
  6. sc.SalePrice ,
  7. sc.CreateBy ,
  8. sc.CreateTime ,
  9. sc.ModifyTime ,
  10. sc.StoreCode ,
  11. sc.ShopCommodityId AS ChannelStoreMappingId ,
  12. sc.ShopCommodityName AS O2OCommodityName ,
  13. sc.ShopCommodityTitle AS O2OCommodityTitle ,
  14. sc.Remark AS Comment ,
  15. sc.OutShopSPUCode ,
  16. sc.ModifyBy ,
  17. sc.ChannelCode
  18. FROM dbo.Channel_ShopCommodity AS sc WITH ( NOLOCK )
  19. WHERE sc.Disabled = 0
  20. AND sc.ChannelCode = '9000000009'
  21. AND sc.CityId = 'eabbe02f-59e0-46e6-90e7-cd8a89dbb98f';

优化后SQL(指定使用索引IX_CityId):

  1. SELECT ROW_NUMBER() OVER ( ORDER BY sc.ModifyTime DESC ) AS RowNumber ,
  2. sc.CommodityCode AS ChannelCommodityCode ,
  3. sc.OutShopCommodityCode AS OutItemId ,
  4. sc.IsShelf ,
  5. sc.OriginPrice ,
  6. sc.SalePrice ,
  7. sc.CreateBy ,
  8. sc.CreateTime ,
  9. sc.ModifyTime ,
  10. sc.StoreCode ,
  11. sc.ShopCommodityId AS ChannelStoreMappingId ,
  12. sc.ShopCommodityName AS O2OCommodityName ,
  13. sc.ShopCommodityTitle AS O2OCommodityTitle ,
  14. sc.Remark AS Comment ,
  15. sc.OutShopSPUCode ,
  16. sc.ModifyBy ,
  17. sc.ChannelCode
  18. FROM dbo.Channel_ShopCommodity AS sc WITH ( NOLOCK, INDEX= [IX_CityId] )
  19. WHERE sc.Disabled = 0
  20. AND sc.ChannelCode = '9000000009'
  21. AND sc.CityId = 'eabbe02f-59e0-46e6-90e7-cd8a89dbb98f';

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

  1. SELECT ROW_NUMBER() OVER ( ORDER BY sc.ModifyTime DESC ) AS RowNumber ,
  2. sc.CommodityCode AS ChannelCommodityCode ,
  3. sc.OutShopCommodityCode AS OutItemId ,
  4. sc.IsShelf ,
  5. sc.OriginPrice ,
  6. sc.SalePrice ,
  7. sc.CreateBy ,
  8. sc.CreateTime ,
  9. sc.ModifyTime ,
  10. sc.StoreCode ,
  11. sc.ShopCommodityId AS ChannelStoreMappingId ,
  12. sc.ShopCommodityName AS O2OCommodityName ,
  13. sc.ShopCommodityTitle AS O2OCommodityTitle ,
  14. sc.Remark AS Comment ,
  15. sc.OutShopSPUCode ,
  16. sc.ModifyBy ,
  17. sc.ChannelCode
  18. FROM dbo.Channel_ShopCommodity AS sc WITH ( NOLOCK, INDEX= [IX_CityId] )
  19. WHERE sc.Disabled = 0
  20. AND sc.ChannelCode = '9000000009'
  21. AND sc.StoreCode IN ( '10000723' );

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

去除指定索引后再次执行

  1. SELECT ROW_NUMBER() OVER ( ORDER BY sc.ModifyTime DESC ) AS RowNumber ,
  2. sc.CommodityCode AS ChannelCommodityCode ,
  3. sc.OutShopCommodityCode AS OutItemId ,
  4. sc.IsShelf ,
  5. sc.OriginPrice ,
  6. sc.SalePrice ,
  7. sc.CreateBy ,
  8. sc.CreateTime ,
  9. sc.ModifyTime ,
  10. sc.StoreCode ,
  11. sc.ShopCommodityId AS ChannelStoreMappingId ,
  12. sc.ShopCommodityName AS O2OCommodityName ,
  13. sc.ShopCommodityTitle AS O2OCommodityTitle ,
  14. sc.Remark AS Comment ,
  15. sc.OutShopSPUCode ,
  16. sc.ModifyBy ,
  17. sc.ChannelCode
  18. FROM dbo.Channel_ShopCommodity AS sc WITH ( NOLOCK )
  19. WHERE sc.Disabled = 0
  20. AND sc.ChannelCode = '9000000009'
  21. AND sc.StoreCode IN ( '10000723' );

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号