Atitit 如何利用先有索引项进行查询性能优化

1.1. 再分析的话就是我们所写的查询条件,其实大部分情况也无非以下几种:1

1.2. 范围查找 动态索引查找1

1.2.1. 索引联合 所谓的索引联合,就是根据就是根据筛选条件的不同,拆分成不同的条件,去匹配不同的索引项。2

1.3. 索引交叉2

1.1. 再分析的话就是我们所写的查询条件,其实大部分情况也无非以下几种:

1、等于谓词:select [email protected]

2、比较谓词:select ...where...column> or < or  <> or <= or >= @parameter

3、范围谓词:select ...where...column in or not in  or between and @parameter

4、逻辑谓词:select ...where...一个谓词 or、and 其它谓词 or、and 更多谓词....

我们就依次分析上面几种情况下,如何利用索引进行查询优化的

1.2. 范围查找 动态索引查找

SELECT OrderID

FROM Orders

WHERE ShipPostalCode IN (N‘05022‘,N‘99362‘)

所以SQL Server尽量想采取索引查找的方式,其实IN关键字和OR关键字逻辑是一样的。

于是上面的查询条件就转换成了:

[Northwind].[dbo].[Orders].[ShipPostalCode]=N‘05022‘ 
                        OR 
                       [Northwind].[dbo].[Orders].[ShipPostalCode]=N‘99362‘

这样就可以采用索引查找了,先查找第一个结果,然后再查找第二个,而这个过程在SQL Server中就被称为:动态索引查找

所以变成参数后首先解决的问题就是去重问题,2个一样的变成1个。

1.2.1. 索引联合 所谓的索引联合,就是根据就是根据筛选条件的不同,拆分成不同的条件,去匹配不同的索引项。

SELECT OrderID

FROM ORDERS

WHERE OrderDate BETWEEN ‘1998-01-01‘ AND ‘1998-01-07‘

OR ShippedDate BETWEEN ‘1998-01-01‘ AND ‘1998-01-07‘

这段代码是查询出订单中的订单日期在1998年1月1日到1998年1月7日的或者发货日期同样在1998年1月1日到1998年1月7日的。

逻辑很简单,我们知道在这种表里面这两个字段都有索引项。所以这个查询在SQL Server中就有了两个选择:

1、一次性的来个索引扫描根据匹配结果项输出,这样简单有效,但是如果订单表数据量比较大的话,性能就会很差,因为大部分数据就根本不是我们想要的,还要浪费时间去扫描。

2、就是通过两列的索引字段直接查找获取这部分数据,这样可以直接减少数据表的扫描量,但是带来的问题就是,如果分开扫描,有一部分数据就是重复的:那些同时在1998年1月1日到1998年1月7日的订单,发货日期也在这段时间内,因为两个扫描项都包含,所以再输出的时候需要将这部分重复数据去掉。

1.3. 索引交叉

奉上一个AND的一个连接谓词的操作方式,这个方式被称为:索引交叉,意思就是说如果两个或多个筛选条件如果采用的索引是交叉进行的,那么使用一个就可以进行查询。

来看个语句就明白了

这里我们采用了的谓词连接方式为AND,所以在实际执行的时候,虽然两列都存在非聚集索引,理论都可以使用,但是我们只要选一个最优的索引进行查找,另外一个直接使用书签查找出来就可以。省去了前面介绍的各种神马排序去重....流聚合去重....等等不人性的操作。

SQL Server调优系列基础篇(索引运算总结) - 指尖流淌 - 博客园.html

SQL Server调优系列基础篇(索引运算总结) - 指尖流淌 - 博客园.html

作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

捕鸟王"Bird Catcher 王中之王King of Kings 虔诚者Pious 宗教信仰捍卫者 Defender of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak

简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴

全名::Emir Attilax Akbar bin Mahmud bin  attila bin Solomon Al Rapanui

埃米尔 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门  阿尔 拉帕努伊

常用名:艾提拉(艾龙),   EMAIL:[email protected]

转载请注明来源:attilax的专栏   http://www.cnblogs.com/attilax/

--Atiend

时间: 2024-12-11 12:26:31

Atitit 如何利用先有索引项进行查询性能优化的相关文章

Sql Server查询性能优化之走出索引的误区

据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是,或者干脆把整个查询SQL直接发给DBA,让DBA直接帮忙优化了,所以造成的状况就是开发人员对于索引的理解.认识很局限,以下就把我个人对于索引的理解及浅薄认识和大家分享下,希望能解除一些大家的疑惑,一起走出索引的误区 误区1.在表上建立了索引,在查询时用到了索引的列,索引就一定会生效 首先明确下这样的

SQL Server 查询性能优化——创建索引原则(一)

索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好.索引建少了,用WHERE子句找数据效率低,不利于查找数据.索引建多了,不利于新增.修改和删除等操作,因为做这些操作时,SQL SERVER除了要更新数据表本身,还要连带地立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间.因此要建得恰到好处,这就需要经验了. 一:索引的基本目的 索引的基

SQL Server 查询性能优化——创建索引原则(二)

三:索引的建立原则 一般来说,建立索引要看数据使用的场景,换句话来说哪些访问数据的SQL语句是常用的,而这些语句是否因为缺少索引(也有可能是索引过多)变的效率低下.但绝不是所有的SQL语句都要建立索引,如果所有的SQL语句都建立索引,那么可能导致建立过多的索引. 我碰到过每秒钟新增记录超过千条的案例,虽然该数据表仅有聚集索引,但因为已存在的键值字段的值和新增数据键值字段的值并不是按顺序递增,每次新增记录时,肯定造成整体数据行的重新排列.在移掉聚集索引后,性能约提升20%.也曾经碰到过一个数据表上

MySQL索引使用方法和性能优化

关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢.还是以WordPress来说,其多个数据表都会对经常被查询的字段添加索引,比如wp_comments表中针对5个字段设计了BTREE索引. 一个简单的对比测试 以我去年测试的数据作为一个简单示例,20多条数据源随机生成200万条

mysql抄书4:索引、慢查询、优化

MySQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都是以B-树的形式保存 如果没有索引,执行查询时,MySQL必须从第一个记录开始整表扫描,知道查询到符合要求的记录,记录越大,花费时间成本越高 如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录,即可迅速取得目标记录所在的位置 比如表有1000条记录,通过索引查找记录至少比顺序扫描记录快100倍 常见索引类型 normal 普通索引 unique 唯一索引,不允许重复的索引,该字段信息保证不会重复,譬如身份证号 f

利用多域名存储静态资源进行性能优化:网站的静态资源为什么要使用独立域名

在大型网站中,我们发现页面资源经常使用不同的域名进行引用,例如126邮箱的部分js.css.图片存放于http://mimg.127.net/域名下,京东的部分静态图片存放在http://img11.360buyimg.com域名下,那这样做究竟有什么好处呢,和性能又有什么关系呢,下面进行具体分析. 一.浏览器并发请求数的限制 我们进行网站页面访问时的客户端是浏览器,浏览器的很多机制对网站的访问速度有很大的影响(例如浏览器对静态资源的缓存机制),此外浏览器为提升页面显示效率,支持并发获取资源,但

Atitit.index&#160;manager&#160;api&#160;design&#160;索引管理api设计

Atitit.index manager api design 索引管理api设计 1. kw1 1.1. 索引类型 unique,normal,fulltxt1 1.2. 聚集索引(clustered index,也称聚类索引1 1.3. 索引方式:btree,hashtable2 1.4. 索引使用所有的页面规模百分比2 2. Ui2 3. api2 3.1. createIndex(indexName,cols)2 3.2. Rebuild2 3.3. Del2 3.4. Up2 4. -

论mysql5.7.13性能优化之索引优化

防伪码:吾日三省吾身 一.MySQL 性能优化之-影响性能的因素 1. 商业需求的影响 不合理需求造成资源投入产出比过低,这里我们就用一个看上去很简单的功能来分析一下. 需求:一个论坛帖子总量的统计,附加要求:实时更新 从功能上来看非常容易实现,执行一条 SELECT COUNT(*) from 表名的 Query 就可以得到结 果.但是,如果我们采用不是 MyISAM 存储引擎,而是使用的 Innodb 的存储引擎,那么大 家可以试想一下,如果存放帖子的表中已经有上千万的帖子的时候,执行这条

SQL Server-聚焦过滤索引提高查询性能(十)

前言 这一节我们还是继续讲讲索引知识,前面我们聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解. 过滤索引,在查询条件上创建非聚集索引(1) 过滤索引是SQL 2008的新特性,被应用在表中的部分行,所以利用过滤索引能够提高查询,相对于全表扫描它能减少索引维护和索引存储的代价.当我们在索引上应用WHERE条件时就是过滤索引.也就是满足如下格式: CREATE NONCLUSTERED INDEX <index name> O