大型系统的生产环境,一般情况下,我们评价一条查询是否有效率,更多的是关注逻辑IO(至于为什么,回头补一篇)。我们常说,“要建彪悍的索引”、“要写高效的SQL”,其实最终目的就是在相同结果集情况下,尽可能减少逻辑IO。

1.1     where条件的列上都得有统计信息。

没统计信息SQLServer就无法估算不同查询计划开销优劣,而只能采用最稳妥的Scan(不管是table scan还是clustered index scan)。一般情况下我们不会犯这种错误——where条件里不使用非索引列是个常识。索引上的统计信息是无法删除的。

1.2     尽量不使用不等于(!=)或者NOT逻辑运算符。

这条规则被广为传颂,原因据联机文档和百敬同学的书讲,也是SQLServer无法评估不同查询计划开销的优劣。但是SqlServer2k5聪明了很多,试验发现尽管用了!=或者not,查询还是会被优化。如下:

create table tb1

(

col1 int identity(1,1) primary key,

col2 int not null,

col3 varchar(64) not null

)

create index ix_tb1_col2 on tb1

(

col2

)

create index ix_tb1_col3 on tb1

(

col3

)

declare @f int

set @f = 0

while @f < 9999

begin

insert into tb1 (col2, col3) values(1, 'ssdd')

set @f = @f + 1

end

insert into tb1 (col2, col3) values(0, 'aadddd')

insert into tb1 (col2, col3) values(2, 'bbddd')

insert into tb1 (col2, col3) values(3, 'bbaaddddddaa')

通过上述代码,各位可以看到数据分布。col2值为1的有9999条;col2值为0、2、3的分别有1条。

按照本条规则,!= 和NOT带来的应该是个scan操作,但实际情况是:
   

SQL2k5很聪明,它依据统计信息分析得出来,应该采用index seek而不是index scan。(稍微解释解释index seek和index scan:索引是一颗B树,index seek是查找从B树的根节点开始,一级一级找到目标行。index scan则是从左到右,把整个B树遍历一遍。假设唯一的目标行位于索引树(假设是非聚集索引,树深度2,叶节点占用k页物理存储)最右的叶节点上(如上例)。index seek引起的IO是4,而index scan引起的IO是K,性能差别巨大。关于索引,可以仔细读读联机文档关于物理数据库体系结构部分)。

1.3     查询条件中不要包含运算

这些运算包括字符串连接(如:select * from Users where UserName + ‘pig’ = ‘张三pig’),通配符在前面的Like运算(如:select * from tb1 where col4 like ‘%aa’),使用其他用户自定义函数、系统内置函数、标量函数等等(如:select * from UserLog where datepart(dd, LogTime) = 3)。

SQLServer在处理以上语句时,一样没办法估算开销。最终结果当然是clustered index scan或者table scan了。

1.4     查询条件中不要包含同一张表内不同列之间的运算

所谓的“运算”包括加减乘除或通过一些function(如:select * from tb where col1 – col2 = 1997),也包括比较运算(如:select * from tb where col1 > col2)。这种情况下,SQLServer一样没办法估算开销。不论col1、col2上都有索引还是创建了col1、col2上的覆盖索引还是创建了col1 include col2的索引。

但是这种查询有解决办法,可以在表上多创建一个计算字段,其值设置为你的“运算”结果,再在该字段上创建一个索引,就Ok了。

To Be Continue…

(II)中将介绍统计信息值分布不均匀对查询的影响和如何避免这些影响,捎带更多的说说返回多行结果时,为啥SQLServer有时会选择index seek,而有时会选择index scan。
(III)中主要介绍传说中的“Foldable”和“NonFoldable”表达式。并举例说说所谓的“Nonfoldable"表达式某些情况下也不是那么可怕。
(IV)中则主要说说在程序中执行SQL。如:安全性,拼SQL、参数化SQL和存储过程之间对DB来说有什么区别,参数化SQL的一些技巧。捎带着,会大概介绍介绍SQLServer的Buffer Pool

转载于:https://www.cnblogs.com/neil-zhao/archive/2009/09/11/1565053.html

写有效率的SQL查询(I)相关推荐

  1. 写有效率的SQL查询(V)

    轉自:http://www.netfocus.cn/peoplearticle994.html 先站在应用程序的角度说说它们的不同. 1. 直接拼SQL 就像大家了解的那样,直接拼SQL带来了SQL注 ...

  2. 写有效率的SQL查询(IV)

    轉自:http://www.netfocus.cn/peoplearticle995.html 本文主要介绍写SQL的另外两个误区: 1. 存储过程中使用局部变量而不使用参数变量(就是存储过程输入参数 ...

  3. 关于SQL查询效率,100w数据,查询只要1秒

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询 ...

  4. SQL查询效率:100w数据查询只需要1秒钟

    机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询性能测试,比较两种查询的性能 SQL查询效率 step by s ...

  5. exists查询慢_8个SQL查询效率优化原则

    点击上方"Java秃头哥",选择"星标" 每天分享优质干货 1.对查询进行优化,应尽可能避免全表扫描 首先应考虑在 where 及 order by 涉及的列上 ...

  6. SQL查询优化方法 提高SQL查询效率 数据库的哪些字段适合添加索引

    如何提高sql的查询效率 在正确的字段上创建索引. 优化查询sql的写法(特别是where语句的写法). 一.数据库的哪些字段适合添加索引 表的某个字段值得离散度越高,该字段越适合选作索引的关键字.主 ...

  7. sql如何遍历几百万的表_关于SQL查询效率,100w数据,查询只要1秒

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询 ...

  8. mysql 索引未命中_联合索引命中率问题导致SQL查询效率慢的问题

    执行 MySQL DumpSlow 结果是:Count: 1358  Time=0.33s (448s)  Lock=0.00s (0s)  Rows=2.5 (3343) Count:出现次数 Ti ...

  9. 一个 提高SQL 查询的讨论帖

    idn(关键字),产品名称,产品数量... B表,有字段:idn,a_idn(记录A表的关键字),工序,工时... A表与B表是一对多的关系, 我想取到A表的明细及B表相关的总工时 sele aa.* ...

最新文章

  1. html5考试总结300字,期中考心得300字5
  2. 全国大学生智能汽车竞赛英飞凌AURIXTM培训--应用篇 : 3月30日直播
  3. 基于matlab的退化图像复原(二)------逆滤波复原
  4. c语言第一周作业答案,C语言程序设计下mooc答案.pdf
  5. 物联网其实只是一个话题
  6. ax3000 梅林_用梅林午餐肉十分钟就能做出来的美食,超级美味又健康,午餐肉还是要选择中粮!...
  7. FFmpeg的模块介绍(一)
  8. JavaScript执行机制-node事件循环
  9. 视频教程-带你轻松入门MATLAB-Matlab
  10. 模糊综合评价-----层次分析法AHP
  11. vue中 jsbarcode的使用技巧
  12. Unity Shader·科技感描边效果(利用Robert算子边缘检测)
  13. 卡首屏源码,淘口令接口,生成淘口令
  14. 蓝桥 字符串跳步 JAVA
  15. 在梦想的道路上,一路前行
  16. ps 套索工具抠图实例
  17. python3.7 win10 64位系统下用pyinstaller打包的程序在32位系统下无法运行
  18. IIC的OLED显示程序
  19. 软件性能测试负载测试,软件性能测试VS负载测试VS压力测试[2]
  20. Vue.js is detected on this page. Devtools inspection is not available becaus...的解决方法

热门文章

  1. 1年sql数据库经验,却说数据模型一文不值?你还没懂数据仓库
  2. Python Series库Api整理
  3. android用IO实现日记的读写,android开发实现文件读写
  4. matlab ct投影数据,CT_projection_and_reconstruction
  5. python 人脸识别调整人脸大的距离_Python 人脸识别就多简单,看这个就够了!
  6. vue修改代码同步页面_vue实现两个组件之间数据共享和修改操作
  7. heap python_python topN max heap,使用heapq还是自实现?
  8. 美团笔试题——公司食堂
  9. 牛客 2021年度训练联盟热身训练赛第二场 D题Soccer Standings
  10. 《深度学习笔记》——初识PyTorch的学习笔记