网站首页 > 精选文章 / 正文
互联网发展了这么多年,经常看到有一些系统,运行了很多年了,数据已经积累到了一定的程度,造成了数据查询慢,用户反馈越来越不满意
今天就碰到一个前端功能有个查询特别慢。用户反馈需要等半天。作为一个全能的全栈工程师,这是事情吗?
有问题解决问题,没有问题,创造问题,然后在解决问题。就是玩。开始性能优化。
执行计划
监控了一下查询的SQL,发现SQL查询比较慢。查看试图源码,打开SQLSERVER的执行计划。
执行查询,发现耗时40秒左右
优化策略
由于SQLSERVER的查询是客户具体的业务逻辑,首先在不清楚客户业务逻辑的情况下,不修改执行的SQL,只增加或者修改索引,来提高查询速度。
是否有官方提示
第一次查询,发现执行计划没有任何提示。一般情况下,如果SQLSERVER在执行的时候,发现没有合适的索引,一般会提示一个索引创建的脚本。
用户这个没有提示,查询表索引,发现的确在所有的关联字段上创建了对应的索引。
优化思路
把试图中每个小的查询单独拿出来,执行查询。发现速度还可以。基本上都在3到4秒左右。
单独执行小的查询,每个表上也基本上创建了索引。
执行计划如下:
发现开销最大的是2个索引,后面还有一个排序的开销。
突然想,是否可以对排序的开销进行索引创建,来提高查询速度。
分别对每个小查询进行排序的索引创建。
这个试图涉及到4个子查询。共创建了4个索引。
再次查询,速度下降到6-8秒。
让用户试了试,很满意。
结果
又是一次成功的优化过程。
查询索引的脚本
select a.name as index_name,c.name as column_name from sysindexes a
inner join sys.index_columns b on a.id=b.object_id and a.indid=b.index_id
inner join sys.columns c on b.object_id=c.object_id and b.column_id=c.column_id
where a.id=object_id('tablename')
Tags:inversejoincolumns
猜你喜欢
- 2025-01-08 Python办公自动化-Excel合并同类项内容
- 2025-01-08 干货:一篇文章让你轻松了解Hive和HBase的特殊关系
- 2025-01-08 深度好文:如何发现并处理MySQL主从延迟问题
- 2025-01-08 数仓|四个在工作后才知道的SQL密技
- 2025-01-08 DAX实战 | 手把手教你使用表函数生成销售表和汇总表
- 2025-01-08 基于goinception搭建DBA审核平台
- 2025-01-08 MySQL5.7升级到MySQL8全过程指导总结
- 2025-01-08 SQL Server系统表sysobjects的应用
- 2025-01-08 GROUPBY和SUMMARIZE的区别
- 2025-01-08 数据库内核杂谈(三十七) - Velox 执行引擎(1)