源栈培训:数据库:11-查询优化

更多
2019年04月05日 19点08分 作者:叶飞 修改

为什么是查询优化?

查询优化 ≠ 数据库优化,但是开发人员(Developer)通常可以控制的部分(其他由DBA负责)


优化方法论

具体的场景采取具体的措施

任何地方都可以优化,但我们优先优化最值得优化(性能瓶颈)的部分。

No Profile,No Improvement


统计(STATISTICS)

SET STATISTICS IO|TIME|PROFILE ON
SET STATISTICS IO|TIME|PROFILE OFF

scan count:在到底叶子节点以后,为获得最终结果继续扫描的数量。通常:0 聚集/唯一索引;1 非聚集/非唯一索引

logical read:从缓存(cache buffer)中读取,所有读都是logical read

physical read:从数据库文件(file/disk)中读取

read-ahead:将读取到的数据放入缓存中

lob:大数据文件(NTEXT,NVARCHAR(MAX),IMG等)

详细文档


BUFFER 和 CACHE


data getData(){
    data = checkInCache()
    if(data!=null){
         return data;
    }else{
         data = checkInDB();
         saveIntoCache(data);
         return data;
    }
}

void setData(data){     
     if(needInBuffer){
         setIntoBuffer(data);
     }else{
         setIntoDB(data);
     }            
}

清理缓存

CHECKPOINT              -- 将所有内存(memory)中的数据写到磁盘(disk)
GO

DBCC DROPCLEANBUFFERS   -- 清除所有缓存
GO


执行计划(Execution Plan)

由SQL Server的“查询优化器”负责生成。生成之后会被缓存。

其内容主要取决于:

  • 索引:
  • 数据分布统计:自动生成并更新
    • 关闭统计
      ALTET DATABASE db_name SET AUTO_UPDATE_STATISTICS OFF|ON
    • 查看统计信息
      DBCC SHOW_STATISTICS('table_name','statistic_name')

把之前所学的所有查询都过一遍。


案例

执行计划可以把SQL语句该得“面目全非”:查找每个作者悬赏值最高的一篇文章

SQL语句(相关子查询):

SELECT opr.Id, opr.Title, opr.Author, opr.Reward
FROM TProblem opr
WHERE Reward = (
SELECT MAX(Reward) FROM TProblem ipr WHERE ipr.Author = opr.Author
)

执行计划却变成:

我能写出来的,最接近于这个执行计划的语句:

SELECT Id, Title, Author, Reward FROM(
SELECT 
Id, Title, Author, Reward
, ROW_NUMBER() OVER(PARTITION BY Author ORDER BY Reward DESC) rmax
FROM TProblem 
WHERE Author IS NOT NULL) otp 
WHERE otp.rmax = 1

还可以试试:

SELECT opr.Id, opr.Title, opr.Author, opr.Reward
FROM TProblem opr
WHERE Reward = (
SELECT TOP 1 Reward FROM TProblem ipr WHERE ipr.Author = opr.Author
ORDER BY Reward DESC
)


作业

尽可能多的写出“查找每个用户关键字最多的求助” 的SQL语句,利用执行计划,找出效率最高的一个。

源栈 数据库 查询优化 执行计划 缓存
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0
叶飞的系列文章

源栈培训:ASP.NET全栈开发

飞哥的源栈培训:线上全程直播,免费收看;线下拎包入住,按周计费。本系列收录所有讲义(含视频录播地址)

编程那些事:菜鸟入门

大飞哥倾力之作,面向有意入行IT/开发/编程的初学者,欢迎任何形式的留言建议……

从包工头到程序猿

真实故事,讲述我在家装公司关门之后,如何转行成为一个程序猿的故事。(《折腾》第三卷)

《折腾》(卷一)青涩

时间段:从大学毕业到开始创业。离开青葱校园,涉世之初的那些往事……

《折腾》(卷二)风雨 之(1)工地

我一个完全的门外汉(无论装修还是管理),开始给黎叔装修房子。从踌躅满志,到四处碰壁;从一往直前,到左右为难……

《折腾》(卷二)风雨 之(2)胸怀

作为一个律师,接工程没签合同,被狠狠的坑了一把!年轻人暴烈的想要复仇,黎叔教他一个企业家的胸怀……

《折腾》(卷二)风雨 之(3)渠道

成立了公司,招聘了员工,开始大力的拓展业务,一个接一个的坑,摔倒了又爬起来……

《折腾》(卷二)风雨 之(4)视野

经历残酷现实的磨砺,终于明白:干啥事,都不能闭门造车,人要走出去,开阔视野……

未分类

系统自动生成的未分类系列

一锅大杂烩

从律师到包工头,从码农到写手,读书交友生活创业,各种零零碎碎,乱七八糟……

人人都是程序猿

计算机编程普及课程,视频:https://space.bilibili.com/55410301/#/channel/detail?cid=49491

全部
关键字



帮助

反馈