SQLServer索引调优实践(2)

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

纳米搜索 纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30 查看详情 纳米搜索

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

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

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

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

建两个索引:

1. 主键ID是Clustered INDEX

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

CREATE NONCLUSTERED INDEX [cnt] ON [dbo].[table1]
(
    [Age] ASC
)
INCLUDE ( [Count])
ON [PRIMARY]

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

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

看看运行效率如何:

磁盘IO和时间:

sql2

实际执行计划:

sql

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

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

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

1. SELECT * FROM table1 WHERE age > 100;
2. SELECT count FROM table1 WHERE age > 100;

看看结果:

磁盘IO和时间:

sql4

实际执行计划:

sql3

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/520385.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Java框架如何支持异步异常处理?
上一篇 2025年11月9日 05:18:54
难以打开的文件,QQ浏览器帮您轻松看!
下一篇 2025年11月9日 05:19:01

相关推荐

  • mysql如何强制使用索引 mysql创建索引后的查询优化技巧

    mysql如何强制使用索引 mysql创建索引后的查询优化技巧mysql如何强制使用索引 mysql创建索引后的查询优化技巧mysql如何强制使用索引 mysql创建索引后的查询优化技巧mysql如何强制使用索引 mysql创建索引后的查询优化技巧

    mysql强制使用索引并非最佳实践,应引导优化器自愿选择索引。1. 定期执行analyze table更新统计信息;2. 通过use index等优化器提示灵活控制索引选择;3. 避免在where子句中对索引列使用函数或类型转换;4. 利用覆盖索引减少回表查询;5. 遵循最左前缀原则创建复合索引;6…

    2026年9月23日 用户投稿
    1000
  • mac怎么重建Spotlight索引_Mac重建Spotlight索引方法

    重建Spotlight索引可解决搜索结果不准确问题。方法一:通过系统设置将启动磁盘添加后移除隐私列表,触发重新索引;方法二:使用终端命令“sudo mdutil -E /”强制重建索引;方法三:重启进入安全模式,系统自动修复并清理索引,适用于前两种方法无效时。 如果您发现Mac上的Spotlight…

    2026年9月20日
    000
  • 索引如何提升mysql查询效率

    索引通过B+树结构改变数据查找方式,使MySQL无需全表扫描即可快速定位数据。有序存储、多层结构和高扇出性让查询效率大幅提升。例如在age字段建索引后,SELECT * FROM users WHERE age = 25可直接在B+树中查找,避免逐行比对。应为高频查询字段创建索引,优先使用复合索引并…

    2026年9月13日
    300
  • 如何在mysql中分析慢查询优化索引

    答案:通过开启慢查询日志、使用EXPLAIN分析执行计划、合理创建复合索引并借助工具优化,可有效提升MySQL查询性能。 在 MySQL 中分析慢查询并优化索引,核心是找出执行效率低的 SQL 语句,定位瓶颈,然后通过合理创建或调整索引提升性能。整个过程需要结合慢查询日志、执行计划分析和实际业务场景…

    2026年9月12日
    100
  • MySQL索引提高查询效率的原因何在

    MySQL索引提高查询效率的原因何在MySQL索引提高查询效率的原因何在MySQL索引提高查询效率的原因何在MySQL索引提高查询效率的原因何在

    mysql教程栏目介绍索引提高查询效率的原因。 背景 我相信大家在数据库优化的时候都会说到索引,我也不例外,大家也基本上能对数据结构的优化回答个一二三,以及页缓存之类的都能扯上几句,但是有一次阿里P9的一个面试问我:你能从计算机层面开始说一下一个索引数据加载的流程么?(就是想让我聊IO) 我当场就去…

    2026年9月7日 用户投稿
    000
  • 终于理解 MySQL 索引要用 B+tree ,而且还这么快

    终于理解 MySQL 索引要用 B+tree ,而且还这么快终于理解 MySQL 索引要用 B+tree ,而且还这么快终于理解 MySQL 索引要用 B+tree ,而且还这么快终于理解 MySQL 索引要用 B+tree ,而且还这么快

    mysql教程栏目介绍理解索引的B+tree。 免费推荐:mysql教程(视频) 前言 当你现在遇到了一条慢 SQL 需要进行优化时,你第一时间能想到的优化手段是什么? 大部分人第一反应可能都是添加索引,在大多数情况下面,索引能够将一条 SQL 语句的查询效率提高几个数量级。 索引的本质:用于快速查…

    2026年9月7日 用户投稿
    200
  • 熟悉MySQL索引

    一、索引简介(1)索引的含义和特定 (2)索引的分类 (3)索引的设计原则 二、创建索引(1)创建表的时候创建索引 (2)在已经存在的表上创建索引 (3)删除索引 (免费学习推荐:mysql视频教程) 一、索引简介 索引用于快速找出在某列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始读…

    2026年9月5日
    100
  • 深入了解MySQL中的索引(用处、分类、匹配方式)

    深入了解MySQL中的索引(用处、分类、匹配方式)深入了解MySQL中的索引(用处、分类、匹配方式)深入了解MySQL中的索引(用处、分类、匹配方式)深入了解MySQL中的索引(用处、分类、匹配方式)

    本篇文章带大家深入了解mysql中的索引,介绍一下索引的优点、用处、分类、技术名词以及匹配方式,希望对大家有所帮助! 对于高级开发,我们经常要编写一些复杂的sql,那么防止写出低效sql,我们有必要了解一些索引的基础知识。通过这些基础知识我们可以写出更高效的sql。【相关推荐:mysql视频教程】 …

    2026年9月4日 用户投稿
    100
  • 深入聊聊mysql索引为什么采用B+树结构

    深入聊聊mysql索引为什么采用B+树结构深入聊聊mysql索引为什么采用B+树结构深入聊聊mysql索引为什么采用B+树结构深入聊聊mysql索引为什么采用B+树结构

    本篇文章是mysql的进阶学习,介绍一下mysql使用b+树作为索引数据结构的原因,希望对大家有所帮助! 索引提高查询效率,就像我们看的书,想要直接翻到某一章,是不是不用一页一页的翻,只需要看下目录,根据目录找到其所在的页数即可。【相关推荐:mysql视频教程】 在计算机中我们需要一种数据结构来存储…

    2026年9月4日 用户投稿
    100
  • 浅析MySQL存储引擎中的索引

    浅析MySQL存储引擎中的索引浅析MySQL存储引擎中的索引浅析MySQL存储引擎中的索引浅析MySQL存储引擎中的索引

    本篇文章和大家聊聊mysql存储引擎中索引如何落地,希望对大家有所帮助! 我们知道不同的存储引擎文件是不一样,我们可以查看数据文件目录: show VARIABLES LIKE ‘datadir’; 每 张 InnoDB 的 表 有 两 个 文 件 ( .frm 和 .ibd ),MyISAM 的 …

    2026年9月4日 用户投稿
    200
  • mysql中主键是索引吗

    mysql中主键不是索引。主键全称“主键约束”,是对表中数据的一种约束,它是表的一个特殊字段,该字段能唯一标识该表中的每条信息;而索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。 本教程操作环境:windows7系统、mysql8版本、Dell…

    2026年9月3日
    100
  • mysql主键和索引的区别是什么

    区别:1、主键用于唯一标识表中某一行的属性或属性组,而索引用于快速寻找具有特定值的记录;2、一个表只能有一个主键,但可以有多个候选索引;3、主键列不允许空值,而索引列允许空值;4、主键是逻辑键,索引是物理键。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 关系数据库依…

    2026年9月3日
    100
  • 开发建议:如何优化ThinkPHP应用的性能

    开发建议:如何优化ThinkPHP应用的性能 随着互联网和移动应用的不断发展,Web应用程序的性能优化变得越来越重要。在开发基于ThinkPHP框架的应用程序时,如何优化其性能成为了开发者们关注的焦点之一。本文将介绍一些优化ThinkPHP应用性能的建议,帮助开发者们更好地利用这个优秀的框架。 数据…

    2026年9月1日
    500
  • RuoYi框架代码生成器如何适配SQL Server数据库?

    RuoYi-SQLServer 代码生成器适配:从 MySQL 到 SQL Server 的迁移 ruoyi框架的sqlserver版本(ruoyi-sqlserver)原本只支持mysql数据库的代码自动生成功能,现在需要将其扩展到sql server。这篇文章将探讨如何修改代码,实现sql se…

    用户投稿 2026年8月28日
    200
  • css样式层叠怎么调优先级

    CSS样式层叠调优的方法 在网页开发中,我们使用CSS来为网页添加样式和布局。然而,当多个样式规则同时应用到一个元素上时,就会出现样式层叠的问题。在这种情况下,我们需要了解如何调优样式的优先级。本文将介绍一些调优样式优先级的方法,并提供具体的代码示例。 CSS样式层叠的优先级由以下几个因素决定: 样…

    2025年12月24日
    900
  • 从基础到实际应用:理解响应式CSS框架

    响应式CSS框架:从原理到实践,需要具体代码示例 引言:在当今移动互联网时代,越来越多的用户使用移动设备浏览网页。为了提供更好的用户体验,开发响应式网页设计变得至关重要。而响应式CSS框架便是实现响应式网页设计的一种强大工具。本文将从原理到实践,介绍响应式CSS框架的基本原理,并给出一些具体的代码示…

    2025年12月24日
    100
  • CSS样式的覆盖规则

    下面为大家带来一篇css样式覆盖规则全面了解。内容挺不错的,现在就分享给大家,也给大家做个参考。 大家都知道CSS的全称叫做“层叠样式表”,但估计很多人都不知道“层叠”二字的含义。其实,“层叠”指的就是样式的覆盖,当一个元素被运用上多种样式,并且出现重名的样式属性时,浏览器必须从中选择一个属性值,这…

    用户投稿 2025年12月24日
    000
  • CSS样式覆盖规则的详细介绍

    大家都知道css的全称叫做“层叠样式表”,但估计很多人都不知道“层叠”二字的含义。其实,“层叠”指的就是样式的覆盖,当一个元素被运用上多种样式,并且出现重名的样式属性时,浏览器必须从中选择一个属性值,这个过程就叫“层叠”。样式覆盖(这种叫法更大众化些)遵循一定的规则,之前我对这个规则一直似懂非懂的,…

    用户投稿 2025年12月23日
    000
  • 实现响应式布局的指导与实践

    如何实现响应式布局:技巧与实践 在当今移动互联网的时代,响应式布局已经成为了设计网站的标配。随着不同设备、不同屏幕尺寸的普及,用户对于网站的期待也越来越高。为了确保用户体验的连续性和一致性,响应式布局成为了网页设计师必备的技能之一。本文将介绍一些实现响应式布局的技巧和实践,帮助读者更好地掌握这一技能…

    2025年12月21日
    000
  • 如何在HTML中创建以罗马数字索引的列表

    概述 索引是指示句子位置或位置的数字。在HTML中,我们可以通过两种方式进行索引:无序列表(ul)和有序列表(li)。在HTML中使用 标签来创建一个带有罗马数字的列表,罗马数字是按顺序编写的数字,因此我们使用有序列表而不是无序列表。要创建带有罗马数字的有序列表,我们需要定义有序列表的类型,即列表中…

    2025年12月21日
    100

发表回复

登录后才能评论
关注微信