一些简单的测试结论

在本机经过一些简单的测试,记录数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查询一些浅薄的结论的更多相关文章

  1. SQL查询性能分析

    http://blog.csdn.net/dba_huangzj/article/details/8300784 SQL查询性能的好坏直接影响到整个数据库的价值,对此,必须郑重对待. SQL Serv ...

  2. 转: 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  3. SQL查询性能分析之(not in)、(and not)、()、(!=)性能比较

    SQL查询性能分析之(not in).(and not).().(!=)性能比较 SQL Server Bruce 3年前 (2013-01-08) 3284浏览 0评论 <:article c ...

  4. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  5. SQL查询语句执行的逻辑顺序

    一.简介 大家都知道SELECT语句是用来查询数据表中的数据的,构成SELECT语句的还有各种元素(where.from.group by等),不同元素又代表了不同的处理逻辑,那么这些元素在执行查询时 ...

  6. 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  7. SpringData JPA进阶查询—JPQL/原生SQL查询、分页处理、部分字段映射查询

    上一篇介绍了入门基础篇SpringDataJPA访问数据库.本篇介绍SpringDataJPA进一步的定制化查询,使用JPQL或者SQL进行查询.部分字段映射.分页等.本文尽量以简单的建模与代码进行展 ...

  8. 开发日记(项目中SQL查询的优化)

    今天发现自己之前写的一些SQL查询在执行效率方面非常不理想,于是尝试做了些改进. 需求为查询国地税表和税源表中,国税有而税源没有的条目数,之前的查询如下: SELECT COUNT(NAME)     ...

  9. 你确定 SQL 查询都是以 SELECT 开始的?

    很多 SQL 查询都是以 SELECT 开始的. 不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否可以对窗口函数返回的结果进行过滤"这个问题,得出的结论是"窗口函 ...

随机推荐

  1. BZOJ2661: [BeiJing wc2012]连连看

    2661: [BeiJing wc2012]连连看 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 483  Solved: 200[Submit][S ...

  2. HDU 5965 扫雷 【模拟】 (2016年中国大学生程序设计竞赛(合肥))

    扫雷 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  3. [leetcode]重建二叉树(先序和终须) 中序遍和后续

    分割后长度相等,就是参数麻烦,p,先序的起始点, ib,ie 终须的结束和开始. /** * Definition for binary tree * public class TreeNode { ...

  4. 2D游戏编程5—锁定频率

    核心利用win心跳函数GetTickCount利用差量锁定fps,如下代码锁定30fps,缺点为如果计算机不能以30fps运行,程序将低于30fps #define WIN32_LEAN_AND_ME ...

  5. 在MyEclipse配置自己安装的Tomcat(2014.08.18)

    今天因为要在tomcat下运行一个java项目,第一次嘛,遇到了不少问题,总结分享一下: 第一次,我直接将 MyEclipse 生成的项目放到 tomcat 安装目录的 webapps 目录下,运行出 ...

  6. 交叉编译中的 --sysroot 等等在编译时的作用

    --sysroot=dir 的作用 如果在编译时指定了-sysroot=dir 就是为编译时指定了逻辑目录.编译过程中需要引用的库,头文件,如果要到/usr/include目录下去找的情况下,则会在前 ...

  7. 8-7-Exercise

    链接:第二次小练 这次是我们这组出的题目~我出了一道......B-Prison rearrangement,感觉有点复杂~不过其实题目想通了还是很简单的...... @荆红浅醉出的是A.C.D,@从 ...

  8. idea静态数据加载失败的解决办法

     把上图中的resource文件夹(存放xml等配置文件)标记成resource.

  9. 今日又遇无法启动apache

    前几天安装了.NET要用到的MSSERVER,之后apache就running none of service. 把微软的MSSERVER停用掉服务就没问题.哪部分冲突了

  10. c#判断输入textbox是否为数字

    asp.net判断输入文字是否是数字 方案一:/**//// <summary> /// 名称:IsNumberic /// 功能:判断输入的是否是数字 /// 参数:string oTe ...