Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
【翻译】SQL Server索引进阶:第二级,深入非聚集索引_创想鸟

【翻译】SQL Server索引进阶:第二级,深入非聚集索引

原文地址:StairwaytoSQLServerIndexes:Level2,DeeperintoNonclusteredIndexes本文是SQLServer索引进阶系列(StairwaytoSQLServerIndexes)的一部分。在第一级中

原文地址:

Stairway to SQL Server Indexes: Level 2, Deeper into Nonclustered Indexes

本文是SQL Server索引进阶系列(Stairway to SQL Server Indexes)的一部分。

在第一级中介绍了SQL Server中的非聚集索引。而且在第一个学习的例子中,我们证明了在从表中获取一行数据的情况下,索引带来的潜在的好处。在这一级中,我们继续介绍非聚集索引,看看他们在提升查询性能中做出的贡献。

我们先来介绍一些理论,了解一些索引的内部信息,帮助我们解释理论,然后执行一些查询。这些查询会在包含和不包含索引的两种情况被执行,开启性能报告,我们可以看到索引产生的影响。

我们继续使用AdventureWorks 数据库的部分表,主要集中在Contact表。我们将只是用一个索引,在上一级中使用的FullName索引,来证明我们的观点。为了确保我们很好的控制Contact表的索引,我们将做两份拷贝,一份建立FullName索引,虚拟主机,一份不建立索引。

 

非聚集索引

在Contacts_index 表建立非聚集索引

  
 

请记住,非聚集索引顺序存储索引键,通过标记来访问表中真正的数据。你可以把标签看做一种指针。将来的级别中会描述标签的格式,标签的用法,标签的细节。

另外,SQL Server的非聚集索引的入口还有一些内部使用的头信息,还有一些可选的数据值。这些在后面的文章中都会有介绍,现在都不是重点内容。

到目前为止,我们只需要知道,键使得SQL Server找到合适的索引入口,入口的标签使得SQL Server访问表对应的行数据。

索引入口有序的好处

索引的入口是有序的,因此SQL Server可以快速的定位入口。扫描可以从头部开始,可以从尾部开始,也可以从中间开始。

因此,如果一个查询,请求所有LastName以S开头的Contact用户(where lastname like ‘s%’)。SQL Server会快速定位到第一个S开头的记录,然后通过索引,使用标签访问数据行,直到第一个T开头的记录。

如果选择的列都包含在索引中,上面的查询会执行的更快。如果我们执行

 

SQL Server快速的导航到S入口,然后通过索引,忽略标签,直接从索引的入口返回数据,直到第一个T入口。在关系数据库的名词中,叫做查询全覆盖索引。

很多SQL的操作都可以从索引中受益,包括:ORDER BY, GROUP BY, DISTINCT, UNION( not UNION ALL ), JOIN … ON 。

谨记从左到右的键顺序的重要性。我们建立的索引对于lastname=“ashton”很管用,但是对于firstname=“ashton”作用会小很多,甚至没有用。

测试一些简单的查询

如果你要执行下面的查询,确保你执行了前面的脚本,创建了contact_index和contact_noindex表,而且也在contact_index表创建了LastName, FirstName索引。

开启统计

 

因为contact表中的数据只有19972行,很难得到有意义的统计时间。大部分的查询都显示CPU time: 0 毫秒,因此我们可以关闭time统计,只显示io统计。如果你需要一张大表来统计真实的time信息,可以用文章后面的脚本构建一个百万行数据的contact表。下面的测试都以19972行的表为测试对象。

测试一个完全覆盖的查询

第一个查询是一个覆盖索引的查询,获取contact表中lastname以S开头的记录的一部分列。下面是执行的信息。

 

SQL语句SELECT FirstName, LastName
FROM dbo.Contacts  — execute with both Contacts_noindex and
— Contacts_index
WHERE LastName LIKE ‘S%’

没有索引的情况下(2130 row(s) affected)
Table ‘Contacts_noindex’. Scan count 1, logical reads 568.

有索引的情况(2130 row(s) affected)
Table ‘Contacts_index’. Scan count 1, logical reads 14.

索引产生的影响IO从568次减少到14次

注释覆盖查询的索引是个好东西。没有索引,就会进行全表扫描。2130行,表明以S开头的记录占到了10%的数据。

 

纳米搜索 纳米搜索

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

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

 

 

 

 

 

 

 

 

测试一个非完全覆盖的查询

我们修改一下查询,还是相同的查询,只是获取的列包含了一些没有建立索引的列,下面是执行的结果。

 

SQL语句SELECT *
FROM dbo.Contacts  — execute with both Contacts_noindex and
— Contacts_index
WHERE LastName LIKE ‘S%’

没有索引的情况下(2130 row(s) affected)
Table ‘Contacts_noindex’. Scan count 1, logical reads 568.

有索引的情况(2130 row(s) affected)
Table ‘Contacts_index’. Scan count 1, logical reads 568.

索引产生的影响IO没有影响

注释在查询的过程中没有使用到索引。在这种情况下,SQL Server觉得使用索引查找,比不适用索引直接扫描,还要做更多的工作。

 

 

 

 

 

 

 

 

 

测试一个非完全覆盖的查询,但是提供更多的条件

我们修改一下查询,还是相同的查询,只是缩减了查询结果的范围,增加使用索引的好处,下面是执行的结果。

 

SQL语句SELECT *
FROM dbo.Contacts  — execute with both Contacts_noindex and
— Contacts_index
WHERE LastName LIKE ‘Ste%’

没有索引的情况下(107 row(s) affected)
Table ‘Contacts_noindex’. Scan count 1, logical reads 568.

有索引的情况(107 row(s) affected)
Table ‘Contact_index’. Scan count 1, logical reads 111.

索引产生的影响IO从568次减少到111次。

注释

SQL Server访问了107条入口,都在索引的连续范围内。每个入口的标签都被用来获取对应的行数据。这些行在表中不是连续的。

这些查询用到了索引,但是不如第一次的覆盖查询效果好,尤其是在IO的读取方面。

你希望读取107次索引,然后获取107条数据,产生107次读取。

之前的查询,请求了2130行数据,没有用到索引。这次请求107行数据,使用了索引。你很像知道使用索引的临界点在哪里?在后面的级别中我们将会介绍这方面的内容。

 

 

 

 

 

 

 

 

 

 

 

 

 

测试一个完全覆盖的聚合查询

最后一个例子是一个聚合查询,包含了count计算。

 

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
交错战线伊根技能是什么 伊根技能介绍
上一篇 2025年11月9日 08:59:09
360智脑大模型应用“图查查”入选生成式人工智能技术标杆案例
下一篇 2025年11月9日 08:59:13

相关推荐

  • 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日
    200
  • 如何在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
  • mysql index关键字的用法是什么

    在mysql中,index关键字可用于创建索引,语法“CREATE INDEX 索引名 ON 表名(列名)”;可用于查看索引,语法“SHOW INDEX FROM 表名”;也可用于修改索引,语法“DROP INDEX 索引名 ON 表名”。 本教程操作环境:windows7系统、mysql8版本、D…

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

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

    用户投稿 2026年8月28日
    200
  • index.html是什么文件?

    index.html是什么文件?index.html是什么文件?index.html是什么文件?index.html是什么文件?

    index.html代表网页的首页文件,是网站的默认页面。当用户访问一个网站时,通常会首先加载index.html页面。 HTML(Hypertext Markup Language)是一种用于创建网页的标记语言,index.html也是一种HTML文件。它包含网页的结构和内容,以及用于格式化和布局…

    2025年12月22日 用户投稿
    100
  • 如何在HTML中创建以罗马数字索引的列表

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

    2025年12月21日
    100
  • 如何用C++实现桥接模式 抽象与实现分离设计方案

    如何用C++实现桥接模式 抽象与实现分离设计方案如何用C++实现桥接模式 抽象与实现分离设计方案如何用C++实现桥接模式 抽象与实现分离设计方案如何用C++实现桥接模式 抽象与实现分离设计方案

    c++++中桥接模式的核心优势在于解耦抽象与实现,使其能独立变化。1. 它通过将一个类中可能变动的具体操作抽离为独立的实现体系,降低类组合数量,避免“m x n”组合爆炸;2. 抽象类(如shape)包含指向实现接口的指针或引用,调用具体实现(如drawingapi),使两者互不影响;3. 适用于多…

    2025年12月18日 用户投稿
    700
  • 安排一个二进制字符串,以在索引范围内获得最大值。C/C++?

    对于一个由0和1组成的给定字符串,我们给出了M个不相交的范围A,B(A 活动是找到一个合法或有效的排列,同时满足以下两个条件− 所有M个给定范围之间的数字之和最大。 字符串将是字典序最大的。字符串1100的字典序比字符串1001高。 立即学习“C++免费学习笔记(深入)”; 示例 Input1110…

    2025年12月17日
    000
  • C/C++程序中的数组

    数组是一组固定数量的相同数据类型的项目。这些元素存储在内存中的连续内存位置中。 可以使用方括号“[]”和数组名称像a[4]、a[3]等从其索引值访问值的每个单个元素。 声明数组 在c/c++编程语言中,通过定义数组的类型和长度(元素数量)来声明数组。下面的语法显示了在c/c++中声明数组的方法− d…

    2025年12月17日
    000
  • 在C语言中,打印给定索引处的链表节点

    we have to print the data of nodes of the linked list at the given index. unlike array linked list generally don’t have index so we have to traverse t…

    2025年12月17日
    000
  • 在数据库管理系统中,B+树

    A B+ tree in DBMS is a specialized version of a balanced tree, a type of tree data structure used in databases to store and retrieve data efficiently.…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信