sqlserver语句大全:SQL Server 索引结构及其使用( 2) 改善SQL语句来源: 发布时间:星期日, 2009年9月6日 浏览:3次 评论:0
比如:
select * from table1 where name=''zhangsan'' and tID > 10000 和执行: select * from table1 where tID > 10000 and name=''zhangsan'' 些人不知道以上两条语句执行效率是否样如果简单从语句先后上看这两个语句确是不样如果tID是个聚合索引那么后句仅仅从表10000条以后记录中查找就行了;而前句则要先从全表中查找看有几个name=''zhangsan''而后再根据限制条件条件tID>10000来提出查询结果 事实上这样担心是不必要SQL SERVER中有个“查询分析优化器”它可以计算出where子句中搜索条件并确定哪个索引能缩小表扫描搜索空间也就是说它能实现自动优化 虽然查询优化器可以根据where子句自动进行查询优化但大家仍然有必要了解下“查询优化器”工作原理如非这样有时查询优化器就会不按照您本意进行快速查询 在查询分析阶段查询优化器查看查询每个阶段并决定限制需要扫描数据量是否有用如果个阶段可以被用作个扫描参数(SARG)那么就称的为可优化并且可以利用索引快速获得所需数据 SARG定义:用于限制搜索个操作它通常是指个特定匹配个值得范围内匹配或者两个以上条件AND连接形式如下: 列名 操作符 <常数 或 变量> 或 <常数 或 变量> 操作符列名 列名可以出现在操作符边而常数或变量出现在操作符另边如: Name='张 3' 价格>5000 5000<价格 Name='张 3' and 价格>5000 如果个表达式不能满足SARG形式那它就无法限制搜索范围了也就是SQL SERVER必须对每行都判断它是否满足WHERE子句中所有条件所以个索引对于不满足SARG形式表达式来说是无用 介绍完SARG后我们来整理总结下使用SARG以及在实战中遇到和某些资料上结论区别经验: 1、Like语句是否属于SARG取决于所使用通配符类型 如:name like ‘张%' 这就属于SARG 而:name like ‘%张' ,就不属于SARG 原因是通配符%在串开通使得索引无法使用 2、or 会引起全表扫描 Name='张 3' and 价格>5000 符号SARG而:Name='张 3' or 价格>5000 则不符合SARG使用or会引起全表扫描 3、非操作符、引起不满足SARG形式语句 不满足SARG形式语句最典型情况就是包括非操作符语句如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等另外还有下面就是几个不满足SARG形式例子: ABS(价格)<5000 Name like ‘% 3' 有些表达式如: WHERE 价格*2>5000 SQL SERVER也会认为是SARGSQL 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上有索引其索引也会失效 0
相关文章
读者评论发表评论 |