关于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的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...
随机推荐
- SQL*Net message to client
SQL*Net message to client The server (foreground process) is sending a message to the client. 这个wait ...
- Resharper中注释代码的快捷键
Resharper中 Visual Studio中 注释代码 Ctrl+Alt+/ Ctrl+E+C 取消注释 Ctrl+Alt+/ ...
- 【转】vc中使用SendMessage正确发送自定义消息的方法--不错
原文网址:http://zhoumf1214.blog.163.com/blog/static/5241940200910265532959/ 最近在用VC2008做开发,后来由于要用到消息的发送,而 ...
- delphi编写winsocket的流程
delphi编写winsocket的流程 1.在窗体创建的时候启用动态连接库(引用winsock) var aWSAData:TWSAData; if WSAStartup($0101, ...
- implicitly_wait()隐式等待
# -*- coding:utf-8 -*- """ implicitly_wait():隐式等待 当使用了隐士等待执行测试的时候,如果 WebDriver没有在 DOM ...
- typedef用法小结
typedef用法小结- - 注意:本文转自网络,版权归原作者所有. typedef typedef用法小结- - 这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等 ...
- 0ull 是什么意思?
unsigned long long 类型的0 同理:#define DEV_IIC1 ( (u64)1 << 7ULL) 这个作用是64位中的第7 ...
- Properties/Property文件读取(键值均)乱码问题!
方法一:使用native2ascii进行转码,这个不做说明,客户不可能帮你转码的. 方法二:当键是因为时直接getProperty即可,但加载后的propertis对象里的键也是中文乱码,就无法通过g ...
- 趣味理解ADO.NET对象模型
为了更好地理解ADO.NET的架构模型的各个组成部分,我们可以对ADO.NET中的相关对象进行图示理解,如图所示的是ADO.NET中数据库对象的关系图. 讲究完关系图后,为了加深大家的理解,我们可以用 ...
- HTTP协议的特点
HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式.2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的 ...