SQLServer索引调优实践(2)

SQLServer索引调优实践(2)

继续SQLServer索引调优实践(2),继续索引调优实践。这次探讨一下索引覆盖 – SQL 主要使用索引去查询你需要的数据,当索引包括所有的你请求查询的字段,SQL 将不需要去在表中查询。这个概念称做索引覆盖。 的Non- INDEX增加了一个包含列(i

继续,继续索引调优实践。这次探讨一下索引覆盖 – sql 主要使用索引去查询你需要的数据,当索引包括所有的你请求查询的字段sqlserver 建立索引,sql 将不需要去在表中查询。这个概念称做“索引覆盖”。

的Non- INDEX增加了一个“包含列( ) ”选项。在 SQL 2005 中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。通过包含非键列,可以创建覆盖更多查询的非聚集索引。当查询中的所有列都作为键列或非键列包含在索引中时,带有包含性非键列的索引可以显著提高查询性能。这样可以实现性能提升sqlserver 建立索引,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据sqlserver 建立索引,从而减少磁盘 I/O 操作。

但应避免添加不必要的列。添加过多的索引列(键列或非键列)会对性能产生不良影响,应该合理使用。和 INDEX,或者组合索引,结合使用,扩大索引覆盖,但不大可能所有列都有索引覆盖,磁盘开销和数据 updat时索引的重新计算的时间开销是巨大的。总之,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生最佳的优化方案。

继续实践,先建个实验表 :

建两个索引:

1. 主键ID是 INDEX

2. 非聚簇索引Non- INDEX建立在Age列上,包含列:Count。

INDEX ON .

ASC

( )

ON

我们的测试SQL语句是:从10万条记录中取出4条记录,两种写法

1. * FROM WHERE age 2. count FROM WHERE age

看看运行效率如何:

磁盘IO和时间:

实际执行计划:

性能居然相差20多倍。为什么?

原来第二句 Count在索引覆盖范围内,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。而第一句 * 选择了所有字段,其中有一个字段Name不在索引覆盖范围内(既不在聚簇索引列,也不在非聚簇索引覆盖列内),SQL 可以在同一个查询中为一个表使用多个索引,并可以合并多个索引(使用联接算法),以便搜索关键字共同覆盖一个查询。查询分析优化器会自动进行选择, 上述执行计划就是优化的结果,依然比第二个index seek慢了20倍。

AITDK

免费AI SEO工具,SEO的AI生成器

下载

然后我又把sql改了一下,变成从10万条记录中取得大部分数据( 返回99900条),小于号改成大于号:

1. * FROM WHERE age > 100;

2. count FROM WHERE age > 100;

看看结果:

磁盘IO和时间:

实际执行计划:

依然是第二句索引覆盖的快,这是毋庸置疑的。但第一句执行计划有所不同,查询分析优化器选择了不同的策略,改为聚簇索引扫描。上面说过了,SQL 可以在同一个查询中为一个表使用多个索引,并可以合并多个索引(使用联接算法)SQLServer索引调优实践(2),以便搜索关键字共同覆盖一个查询。查询分析优化器会自动进行选择, 上述执行计划就是优化的结果。

为何结果集较小和结果集较大选择的索引方案不同?

(From园友 高强:当 WHERE age 100时,由于记录数比较多,所以SQL 认为直接根据聚集索引叶级页面链表扫描页面得出结果更快。不管怎样,最终目的就是在相同结果集情况下,尽可能减少逻辑IO。)

看到这儿,恐怕喜欢用*的同学也要节制一下使用了,有时候中*代价是很高的。当然类似这种SQL是没有问题的,(where ( * from …)),因为查询分析优化器会聪明的知道此*非彼*。

数据库是一个很复杂的系统,即使你不是数据库专家,是应用开发人员,知道一点内部更多的东西会有好处,而合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来, 才能产生最佳的优化方案。

或许您对以下文章有兴趣:

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » SQLServer索引调优实践(2)

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们