关于SQL IO的一些资料
前些天在做优化的时候发现一个有意思的现象,单纯的SQL执行很快,秒级返回,但是页面响应却很慢,一直在想这是为什么呢?有点怀疑服务器的IO有问题,想了想做了个实验,模拟了同样的场景,通过优化SQL将查询带来的IO开销降低了7到8倍的样子,页面响应果然得到了很大的提升。对于SQL的IO我没什么太多的研究,这里罗列一些东西,权当是为以后的深入研究做个资料的收集吧。园子里有很多关于SQL IO 的介绍,写的都很不错,说实话有很多看的我云里雾里的,故退而其次写一些皮毛的东西。这里只讲现象,不讲故事,场景也不一定完全的合理,具体的情况还得具体对待,不可对号入座哦。
怎么才能降低SQL所带来的IO开销呢?仁者见仁智者见智,下面我列一些常见的查询方式:
- 表连接与子查询
2个表结构如图,CustomerID做为关联键,左表记录100W左右,右表:5条,下面是我们比较常见的2个查询语句:
查询A:
SET STATISTICS IO ON
SELECT *,b.phone FROM dbo.Customers a LEFT JOIN dbo.CustomerDetial b ON a.CustomerID=b.CustomerID 对应的额IO
(1000002 行受影响)
表'CustomerDetial'。扫描计数1,逻辑读取3 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'Customers'。扫描计数1,逻辑读取6954 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。 查询B:
SET STATISTICS IO ON
SELECT*,(SELECT phone FROM dbo.CustomerDetial WHERE Customerid=a.CustomerID) phone FROM dbo.Customers a 对应的额IO
(1000002 行受影响)
表'CustomerDetial'。扫描计数1000002,逻辑读取3000006 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'Customers'。扫描计数1,逻辑读取6954 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
从这个列子我们可以看到子查询付出的IO开销远远大于表连接,一般情况下能使用表连接则不要用子查询,当然这个不是一定的,还是要具体情况具体分析。
- Exists、innerjoin、in
这三者的使用也比较常见,建议的使用优先级inner join—> Exists—>in
- OR 语句
建议使用Union来替换
- 有效使用索引
有效使用索引可以降低索引扫描和表扫描带来的IO开销,特别要注意的是复合索引、覆盖索引的使用
- 减少查询的列数、记录数
今天先到这里,后续继续补充。同时欢迎看到该文章的朋友提供资料。
关于SQL IO的一些资料的更多相关文章
- sql server索引功能资料
无论何时对基础数据执行插入.更新或删除操作,SQL Server 数据库引擎都会自动维护索引.随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片).当索引包含的页中的逻辑排序(基于 ...
- 磁盘IO子系统学习资料
1.http://www.ibm.com/developerworks/cn/linux/l-cn-read/ (IBM read系统调用剖析) 2.http://lenky.info/arch ...
- SQL IO监控
DBCC DROPCLEANBUFFERS --清空缓存 SET STATISTICS IO { ON | OFF } SET STATISTICS TIME { ON | OFF }
- linux硬盘IO优化相关资料整理
内核相关参数 相关内核参数,有条件的话可以修改参数测试验证一下. 1./proc/sys/vm/dirty_ratio 这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统 ...
- SQL Server 2014里的IO资源调控器
在本文中,我们将来看看SQL Server 2014在资源调控器方面增加了哪些新的功能.资源调控器(Resource Governor)是从SQL Server 2008开始出现的一项功能.它是用于管 ...
- [SQL Server]一次执行资料夹内的.sql 指令码
原文:[SQL Server]一次执行资料夹内的.sql 指令码 初始资料库时,我们Developers们会准备很多.sql指令码来建立资料表.检视甚至初始资料,那麽要怎麽一次执行资料夹内的*.sql ...
- nested exception is java.sql.SQLException: IO 错误
1.错误描述 (mx.messaging.messages::ErrorMessage)#0 body = (null) clientId = "18CE3B03-9709-9DA8-763 ...
- MS SQL巡检系列——检查外键字段是否缺少索引
前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...
- MS SQL巡检系列——检查重复索引
前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...
随机推荐
- 手动更改WIN远程桌面端口,要改两个地方的注册表哟
看到我的服务器有老多人在用桌面连接,虽然进不去,但他们不停地试,浪费掉不少服务器资源,我看到网上有不少关于修改3389的介绍.修改3389的工具,一些工具一点用都没有,纯属扯淡.修改后照样是3389. ...
- eclipse 导入Android项目时报告 Invalid Project Description
现象描述: 1.新建Android项目XX2.删除Android项目XX3.使用Existing Android Code Into Workspace(EACIW)导入Android项目XX,报错: ...
- 【HDOJ】2782 The Worm Turns
DFS. /* 2782 */ #include <iostream> #include <queue> #include <cstdio> #include &l ...
- java学习面向对象之内部类
什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...
- HTML5 Canvas JavaScript库 Fabric.js 使用经验
首先,表明我的态度:采用 Flash 才是最优方案,不建议使用 HTML 5 的 Canvas 做一些生产/工业级的网页应用. Flash的优势一是浏览器支持好,二是代码成熟稳定.而HTML5 的 C ...
- [IoLanguage]Io Tutorial[转]
Io Tutorial Math Io> 1+1 ==> 2 Io> 2 sin ==> 0.909297 Io> 2 sqrt ==> 1.414214 ...
- Git error: hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused b
hint: Updates were rejected because the remote contains work that you dohint: not have locally. This ...
- Myeclipse在启动Tomcat服务器的时候总是进入debug视图的解决方法
最近调试程序,由于出现过一些错误,在调试的时候,更改过一些东西,但是后来在myeclipse下启动Tomcat服务器的时候,自动的跳入到debug视图了(以前是一启动Tomcat服务器后,直接就加载t ...
- [JIT_APP]Java基础知识总结
一.Java语言的基础知识 1. 开发Java语言的公司 美国Sun(Sum Microsystems)公司开发. 2.Java的3个版本 J2SE(Java2 Standard Edition) ...
- 常见的HTTP状态码深入理解
状态码的职责是当客户端向服务器端发送请求时,描述返回请求结果.借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了什么错误. RFC2616定义的状态码,由3位数字和原因短信组成. 数字中的第 ...