SQL查询一些浅薄的结论
一些简单的测试结论
在本机经过一些简单的测试,记录数6W条,得出以下结论,不同的硬件环境和数据记录数,可能会有不一样的结论
1.in, or, exists, like, not in , not exists都会利用索引,SQLSERVER会做性能优化,查询性能都差不多
2.in , exists, not in , not exists如果作子查询,如果有索引的话会利用索引分别查出相应的记录到内存,然后做join匹配运算
3.union, union all性能不是很好,重复查询,有时不如in,or
4.order by 一般情况比较损耗cpu,如果没有什么限定条件并且order by字段又有索引,则会利用此索引排序,此时就不损耗cpu而是IO
5.<>等负向查询虽会利用索引,但IO性能依然很差,因为SQLSERVER是按BTree二分查找法得到相应的记录
6.对字段做函数查询性能很差,如charindex('x', 字段) > 1,不会利用索引,性能较差,而且要对字段进行运算。
7.对表进行查询,如果where条件是用and连接起来,
比如:where addtime >= '2013-12-28' and addtime < '2013-12-29' and note like '%abcd%' and ....and ....,
SQLSERVER会选择最优的查询条件查询,上面语句,假如addtime做了索引,则SQLSERVER会用addtime索引查询,抽取相关页到内存中,
然后like等将在内存中匹配,对于IO的影响应该是没有的。
8.每个表都应该设置聚集索引,最好选择惟一的,最小的列,聚集索引列可以与主键不同,聚集索引目的是提升查询性能,而主键则代惟一一条记录,
大多数情况下是可以一样的,比如:订单ID(int),订单编号 char(16),则建议订单ID作为聚集索引,订单编号做惟一索引,从业务上讲订单编号应为主键,
从系统角度也可以把订单ID定义为主键。
如果聚集索引是惟一的话可以直接定位到哪条数据,非聚集索引的子页都聚集索引页,所以聚集索引的好坏将影响到所有的索引。
非聚集索引注意的问题
如果非聚集索引的重复记录很多,即使使用此条件做查询,也不会用相应的非聚集索引,此时SQLSERVER会采用全表扫描,
因为非聚集索引会重复抽取符合条件的页到内存中,导致逻辑读取次数明显增加,对IO影响较大。比如:type作非聚集索引,
在非聚集索引页中如果有10条记录在同一数据页中,会加重复载10次相同的数据页到内存中,至于SQLSERVER为什么会这样
处理,还不清楚。所以重复记录很多的字段不需要建索引。
非聚集索引中的覆盖索引
覆盖索引的意思是查询语句所有出现的字段都包含在索引中,这样SQLSERVER只要扫描索引页就可以得到所有需要的数据,覆盖索引
会明显提升性能。覆盖索引的语法:
create index indexname on tablename(索引字段1, 索引字段2,...) include(读取的字段1, 读取的字段2,...)
覆盖索引要注意的问题是1:不允许超出16个字段,2:数据越小越好。
总结:
以上只是个人的一些浅薄的结论,欢迎指正,SQL语句优化,还是要在生产环境调校为准
SQL查询一些浅薄的结论的更多相关文章
- SQL查询性能分析
http://blog.csdn.net/dba_huangzj/article/details/8300784 SQL查询性能的好坏直接影响到整个数据库的价值,对此,必须郑重对待. SQL Serv ...
- 转: 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
- SQL查询性能分析之(not in)、(and not)、()、(!=)性能比较
SQL查询性能分析之(not in).(and not).().(!=)性能比较 SQL Server Bruce 3年前 (2013-01-08) 3284浏览 0评论 <:article c ...
- SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...
- SQL查询语句执行的逻辑顺序
一.简介 大家都知道SELECT语句是用来查询数据表中的数据的,构成SELECT语句的还有各种元素(where.from.group by等),不同元素又代表了不同的处理逻辑,那么这些元素在执行查询时 ...
- 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
- SpringData JPA进阶查询—JPQL/原生SQL查询、分页处理、部分字段映射查询
上一篇介绍了入门基础篇SpringDataJPA访问数据库.本篇介绍SpringDataJPA进一步的定制化查询,使用JPQL或者SQL进行查询.部分字段映射.分页等.本文尽量以简单的建模与代码进行展 ...
- 开发日记(项目中SQL查询的优化)
今天发现自己之前写的一些SQL查询在执行效率方面非常不理想,于是尝试做了些改进. 需求为查询国地税表和税源表中,国税有而税源没有的条目数,之前的查询如下: SELECT COUNT(NAME) ...
- 你确定 SQL 查询都是以 SELECT 开始的?
很多 SQL 查询都是以 SELECT 开始的. 不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否可以对窗口函数返回的结果进行过滤"这个问题,得出的结论是"窗口函 ...
随机推荐
- 从零开始学习jQuery
转自:http://www.cnblogs.com/zhangziqiu/archive/2009/04/30/jQuery-Learn-1.html 本系列文章导航 从零开始学习jQuery (一) ...
- 还是畅通工程 --HDOJ 1233
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- Linux学习笔记31——网络信息
一 主机数据库函数 #include <netdb.h> struct hostent *gethostbyaddr(const void *addr, //地址 size_t len, ...
- HDOJ/HDU 2140 Michael Scofield's letter(字符转换~)
Problem Description I believe many people are the fans of prison break. How clever Michael is!! In o ...
- 转载: Asp.net常见word,excel,ppt,pdf在线预览方案
参考链接: http://www.cnblogs.com/wolf-sun/p/3569960.html
- JavaScript高级程序设计29.pdf
insertAdjacentHTML方法 插入标记最后一个新增的方式是insertAdjacentHTML()方法,它接收两个参数:插入位置和要插入的HTML文本,第一个参数必须是下列值之一: &qu ...
- Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1573 Solv ...
- 从Spark-Shell到SparkContext的函数调用路径过程分析(源码)
不急,循序渐进,先打好基础 Spark shell的原理 首先,我们清晰定位找到这几个. 1.spark-shell 2. spark-submit 3.spark-class 4.SparkSu ...
- IT项目管理的六种错误思维
导读:在软件行业,在界面设计没有正式展现给客户之前,所有的工作都处于需求调研阶段.很多IT项目经理因为年轻,初生牛犊不怕虎,胆量大,勇气足,敢于在实践中引入新的工具.方法.敢于尝试不是坏事,但试验的风 ...
- JavaEE自定义标签:标签类的创建、tld配置文件的创建(位置、如何创建)、Web-XML配置、JSP应用
1.标签 以类似于html标签的方式实现的java代码的封装. 第一:形成了开发标签的技术标准---自定义标签的技术标准. 第二:java标准标签库(sun之前自己开发的一系列的标签的集合)jstl, ...