SQL Server 索引结构及其使用(二) 改善SQL语句

2016-02-19 10:29 5 1 收藏

今天图老师小编给大家展示的是SQL Server 索引结构及其使用(二) 改善SQL语句,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】

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

  事实上,这样的担心是不必要的。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 价格*25000

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上有索引,其索引也会失效。
当前1/3页 123下一页

来源:http://www.tulaoshi.com/n/20160219/1594799.html

延伸阅读
索引在数据库相关工作者的日常工作中占据了很重要的位置,索引需要牵涉到索引创建、优化和维护多方面的工作,本文以实例结合相关原理来介绍索引维护相关的知识。文中的相关代码,也可以满足多数情况下索引的维护需求。 实现步骤 1. 以什么标准判断索引是否需要维护? 2. 索引维护的方法有哪些? 3. 能否方便地整理出...
标签: SQLServer
  在 SQL Server 2005 中查询表结构及索引 -- 1. 表结构信息查询 -- =================================================== -- 表结构信息查询 -- 邹建 2005.08(引用请保留此信息) -- ==================================================== SELECT     TableName=CASE WHEN C.column_id=1 THEN O.name ELSE N'' END, ...
标签: SQLServer
一般情况,使用sql server中的全文索引,经过大体4个步骤:      1).安装full text search全文索引服务;      2).为数据表建立full text catalog全文索引目录;      3).进行full text catalog的population操作(使全文索引...
具体操作: 根据master.dbo.sysprocesses中的spid和blocked查找当前阻塞语句的主人,然后使用DBCC INPUTBUFFER ()查看阻塞语句。 例子: 打开三个查询分析器 A、B、C 创建一个测试用的表 testDia Create Table testDia(ID int); 在A执行以下语句: Begin tran Insert Into testDia Values(1); 在B执行以下语句: Select * from t...
由于有了很多新功能,我们可以看到在SQL Server 2005和现在有SQL Server 2008中,Microsoft引进了一些动态管理视图来协助确认基于查询历史的可能索引候选人。 这些动态管理视图是: n sys.dm_db_missing_index_details –返回关于缺失索引的详细信息。 n sys.dm_db_missing_index_group_stats - 返回缺失索引组的摘要信息 ...

经验教程

469

收藏

87
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部