北大青鸟郑州鸿博省内唯一校企合作院校
 
北大青鸟郑州鸿博网站首页 北大青鸟郑州鸿博中心概况 北大青鸟郑州鸿博新闻动态 北大青鸟郑州鸿博课程介绍 北大青鸟郑州鸿博师资力量 北大青鸟郑州鸿博就业广场 北大青鸟郑州鸿博学员天地 北大青鸟郑州鸿博在线报名 北大青鸟郑州鸿博招生问答 北大青鸟郑州鸿博视频专区
 
学完课程后,能做什么? 英语、数学不好,能学好软件开发吗? 郑州鸿博在线咨询 郑州鸿博在线咨询 郑州鸿博在线咨询
北大青鸟郑州鸿博查看课程 北大青鸟郑州鸿博了解师资 北大青鸟郑州鸿博开班信息 北大青鸟郑州鸿博学员就业 北大青鸟郑州鸿博在线咨询 北大青鸟郑州鸿博网络报名 设北大青鸟郑州鸿博主页为首页 将北大青鸟郑州鸿博主页加入收藏
北大青鸟郑州鸿博大学生入口 北大青鸟郑州鸿博中专职高生入口
北大青鸟郑州鸿博高中生入口 北大青鸟郑州鸿博失业行业者入口
   
北大青鸟郑州鸿博栏目导航课程介绍 北大青鸟郑州鸿博栏目导航专业详解
北大青鸟郑州鸿博栏目导航课程体系 北大青鸟郑州鸿博栏目导航特色优势
北大青鸟郑州鸿博栏目导航教学方法 北大青鸟郑州鸿博栏目导航教材样本
北大青鸟郑州鸿博栏目导航疑问详解 北大青鸟郑州鸿博栏目导航课程定位
北大青鸟郑州鸿博栏目导航企业需求 北大青鸟郑州鸿博栏目导航项目实战
北大青鸟郑州鸿博栏目导航.NET培训 北大青鸟郑州鸿博栏目导航JAVA培训
北大青鸟郑州鸿博栏目导航在线测试 北大青鸟郑州鸿博栏目导航在线报名
北大青鸟郑州鸿博在线咨询
北大青鸟郑州鸿博QQ在线咨询
北大青鸟郑州鸿博免费通话
北大青鸟郑州鸿博 推荐文章
SQL Server 索引结构及其使用

  作者:北大青鸟郑州鸿博管理员   来源:郑州鸿博   发布日期:2009-05-27   点击次数:182  

        很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如:

 

select * from table1 where name=''zhangsan'' and tID > 000和执行:

 

select * from table1 where tID > 000 and name=''zhangsan''  

 

        一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name=''zhangsan''的,而后再根据限制条件条件tID>000来提出查询结果。


  事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。


  虽然查询优化器可以根据where子句自动的进行查询优化,但大家仍然有必要了解一下“查询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。


  在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。


  SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下:

 

列名 操作符 <常数 或 变量>

 

 

<常数 或 变量> 操作符列名列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:

 

Name=’张三’

 

价格>5000

 

5000<价格

 

Name=’张三’ and 价格>5000  如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。


  介绍完SARG后,我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验:

 

1、Like语句是否属于SARG取决于所使用的通配符的类型

 

如:name like ‘张%’ ,这就属于SARG

而:name like ‘%张’ ,就不属于SARG。原因是通配符%在字符串的开通使得索引无法使用。

 

2、or 会引起全表扫描


  Name=’张三’ and 价格>5000 符号SARG,而:Name=’张三’ or 价格>5000 则不符合SARG。使用or会引起全表扫描。

 

3、非操作符、函数引起的不满足SARG形式的语句


  不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。下面就是几个不满足SARG形式的例子:

 

ABS(价格)<5000

Name like ‘%三’

有些表达式,如:

WHERE 价格*2>5000

SQL SERVER也会认为是SARG,SQL SERVER会将此式转化为:
WHERE 价格>2500/2但我们不推荐这样使用,因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。

 

4、IN 的作用相当与OR

 

语句:Select * from table1 where tid in (2,3)和Select * from table1 where tid=2 or tid=3是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。

 

5、尽量少用NOT

 

6、exists 和 in 的执行效率是一样的


  很多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用not exists来代替not in。但事实上,我试验了一下,发现二者无论是前面带不带not,二者之间的执行效率都是一样的。因为涉及子查询,我们试验这次用SQL SERVER自带的pubs数据库。运行前我们可以把SQL SERVER的statistics I/O状态打开:

 

(1)select title,price from titles where title_id in (select title_id from sales where qty>30)该句的执行结果为:


致力于做河南最好

北大青鸟IT教育

郑州北大青鸟咨询
企业人才预定热线
北大青鸟地址
邮编

传真

乘车路线

豫icp备08003493号

版权所有2008-2013

0371-67938311
0371-67938377
郑州市建设路和嵩山路交叉口向西50米泰隆大厦十六楼
450000

0371-67938377

从火车站坐1.68.99.101西线到碧沙岗站下车;从北站坐9.88.909路到碧岗站下车;从东站和南站坐521路到碧沙岗站下车;从西站坐315.31到碧沙岗下车.

北大青鸟APTECH(郑州鸿博)授权培训中心