我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【SQL SERVER】索引

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【SQL SERVER】索引

【SQL SERVER】索引

在做开发过程中经常会接触数据库索引,不只是DBA才需要知道索引知识,了解索引可以让我们写出更高质量代码。简单介绍索引的概述,聚集索引,非聚集索引,唯一索引,复合索引,筛选索引使用及注意事项

在做开发过程中经常会接触数据库索引,不只是DBA才需要知道索引知识,了解索引可以让我们写出更高质量代码。

  1. 索引概述
  2. 聚集索引
  3. 非聚集索引
  4. 唯一索引
  5. 筛选索引
  6. 非聚集索引包含列

索引概述

       索引的存在主要为了提高数据检索速度,设计高效的索引对于获得良好的数据库和应用程序性能极为重要。

       索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,就像平常我们用的新华字典的目录,假如新华字典没有目录有找一个字就必须从第一页一直翻到最后一页,这是多么令人绝望的事情。

  索引是占有而外空间,是一种典型的空间换时间的做法,所以对待索引必须要保持敬畏之心,要建立在经常筛选的条件上,查询数据要时刻想着利用索引,竟然都花额外空间存储索引,不能让它白白浪费掉。

 

聚集索引

聚集索引基于数据行的键值在表内排序和存储这些数据行。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。  

简单来说就是聚集索引和数据的存放顺序是一致的,聚集索引叶节点就是数据。

创建准则

 定义聚集索引键时使用的列越少越好

 唯一或包含许多不重复的值(若创建聚集索引时没使用唯一属性,SQL Server会自动添加一个4字节的唯一标识列)

经常需要顺序访问数据

 经常用于对表中检索到的数据进行排序

 列大小不超过900字节

适合使用聚集索引情况

使用运算符(如 BETWEEN、>、>=、< 和 <=)返回一系列值

返回大型结果集

 使用 JOIN 子句;一般情况下,使用该子句的是外键列

 使用 ORDER BY 或 GROUP BY 排序/分组数据(因为分组数据也是要先排序)

不适合使用聚集索引情况

 频繁更改的列,每次更改都会导致索引页不断重新构建。

 若干列或若干大型列的组合,每次构建排序需要大量计算

TSQL创建聚集索引

--唯一的聚集索引
CREATE UNIQUE CLUSTERED INDEX [IX_TableName_Name] ON [dbo].[TableName] ([FieldName] ASC)

--不唯一的聚集索引
CREATE CLUSTERED INDEX [IX_TableName_Name] ON [dbo].[TableName] ([FieldName] ASC)

 

非聚集索引

非聚集索引包含索引键值和指向表数据存储位置的行定位器。 可以对表或索引视图创建多个非聚集索引。 通常,设计非聚集索引是为改善经常使用的、没有建立聚集索引的查询的性能。

简单来说不是聚集索引的就是非聚集索引。额,好像没解释一样。。。非聚集索引的叶节点是定位器。

创建准则

 不超过1700字节(其他文档说是900字节,我测试SQL Server是1700字节)

 避免添加不必要的列,因为增加索引维护成本

 包含许多不重复的值,这样才能更好利用索引查询效率

列的长度尽可能小

适合使用非聚集索引情况

 使用 JOIN 或 GROUP BY 子句

 不返回大型结果集的查询

 经常包含在查询的搜索条件中的列

不适合使用非聚集索引情况

列的重复值较少

不是经常查询的搜索条件的列

列的长度过长,因为增加索引维护成本

聚集索引与非聚集索引区别(知识有限,未必全,希望补充)

聚集索引是按物理顺序排列,非聚集索引逻辑顺序排列

聚集索引一个表只能有一个,非聚集索引可以多个

聚集索引的叶节点是数据,非聚集索引的叶节点是定位器

聚集索引不能附加信息,非聚集索引可以包含附加信息

TSQL创建非聚集索引

CREATE INDEX IX_TableName_FieldName ON DataTable(FieldName DESC)

 

唯一索引

唯一索引能够保证索引键中不包含重复的值,从而使表中的每一行从某种方式上具有唯一性。 只有当唯一性是数据本身的特征时,指定唯一索引才有意义。

保证索引键中不包含重复的值(包含NULL值)

创建准则

 1. 只有需要保证数据唯一性的情况下才使用

适合使用唯一索引情况

 需要保证数据唯一性

不适合使用唯一索引情况 

不需要保证数据唯一性

TSQL创建唯一索引

CREATE UNIQUE INDEX IX_TableName_FieldName ON DataTable(FieldName ASC) 

 

筛选索引

 筛选索引是一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询。 筛选索引使用筛选谓词对表中的部分行进行索引。

只把符合条件的数据做索引,相当于在一个表的子集做索引。从而达到下面几个好处

提高了查询性能 ,因为索引页的数据比全表索引小

减少索引维护开销,因为只有符合条件才会对索引页维护

减少索引存储开销,道理跟上面一样

创建准则

筛选的条件必须是明确的值

通常来说经常查询出现的条件跟过滤条件符合

经常检索的都是数据的子集

适合使用筛选索引情况

 经常筛选表的子集数据,例如通常我们只查询有效的订单,无效的订单很少查,或者基本不查,这种情况适合建立筛选索引

只查最近数据,例如记录只查最近一个月,可以通过定期在数据库空闲的时重新维护筛选索引达到加快查询效率

不适合使用筛选索引情况

 经常查询条件包含筛选值外,这样导致走全表扫描(前提没其他索引覆盖到)

查询条件不固定

TSQL创建唯一索引

CREATE INDEX IX_TableName_FieldName ON [dbo].[TableName](FieldName ASC)  where State > 1

 

非聚集索引包含列

 通过将非键列添加到非聚集索引的叶级,扩展非聚集索引的功能。 通过包含非键列,可以创建覆盖更多查询的非聚集索引

通过把包含的列同时维护在索引页,达到当查询的数据都包含在索引中的数据的时候,因为在索引页找到所有数据,就不需要访问表的数据页,从而减少I/O操作,这种通常称为“覆盖查询”

创建准则

必须至少定义一个键列

在 CREATE INDEX 语句的 INCLUDE 子句中定义非键列

只能对表或索引视图的非聚集索引定义非键列

允许除 text、 ntext和 image之外的所有数据类型

精确或不精确的确定性计算列都可以是包含列

不能同时在 INCLUDE 列表和键列列表中指定列名

INCLUDE 列表中的列名不能重复

索引键列(不包括非键)必须遵守现有索引大小的限制

所有非键列的总大小只受 INCLUDE 子句中所指定列的大小限制;例如, varchar(max) 列限制为 2 GB

适合使用非聚集索引包含列

 筛选的列是索引键 && 查询的列都是包含的列

不适合使用非聚集索引包含列

 筛选的列不是索引键  ||  查询的列有不在包含列中的

TSQL创建筛选索引

CREATE  INDEX IX_TableName_FieldName ON DataTable(Field1 ASC) INCLUDE(Field2)

转发请标明出处: https://www.cnblogs.com/WilsonPan/p/12625364.html

参考文章

SQL Server 索引体系结构和设计指南 - SQL Server | Microsoft Docs 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【SQL SERVER】索引

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【SQL SERVER】索引

在做开发过程中经常会接触数据库索引,不只是DBA才需要知道索引知识,了解索引可以让我们写出更高质量代码。简单介绍索引的概述,聚集索引,非聚集索引,唯一索引,复合索引,筛选索引使用及注意事项 在做开发过程中经常会接触数据库索引,不只是DBA才需要知
【SQL SERVER】索引
2019-05-21

SQL Server 全文搜索/全文索引

全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类型的基于标记的功能性索引,它是由 SQL Server 全文引擎生成和维护的。生成全文索引的过程不同
SQL Server 全文搜索/全文索引
2014-12-30

SQL Server 索引的含义和特点

索引用于快速找出在某个列中某一特定值的行。不使索引,数据库必须从第一条记录开始读完整个表,直到找到相关行。如果表中查询的列有一个索引,数据库能快速到达一个位置去搜寻数据,而不必查看所有数据。索引的含义和特点:索引是一个单独的、存储在磁盘上的数据结构,他们包含着
SQL Server 索引的含义和特点
2018-08-17

SQL Server索引优化常用查询

1.1、查找缺失索引SELECT A.USER_SEEKS 查找次数,A.USER_SCANS 扫描次数, ROUND(A.AVG_TOTAL_USER_COST,2) 减少的用户查询的平均成本,A.AVG_USER_IMPACT 可能获得的平均百分比收
SQL Server索引优化常用查询
2014-10-16

SQL Server中索引的用法详解

索引是一种数据结构,用于提高数据库中数据的查询效率。SQL Server中的索引可以分为聚集索引和非聚集索引两种类型。聚集索引决定了表中数据的物理存储顺序,一个表只能有一个聚集索引;非聚集索引是基于表的某个列或多个列创建的辅助索引,一个表可
2023-08-17

SQL Server中的索引怎么使用

在SQL Server中,索引可以提高查询性能,加快数据的检索速度。下面是一些使用索引的常见方法:1. 创建索引:在需要加速查询的列上创建索引。可以使用CREATE INDEX语句来创建索引。2. 查看索引:使用系统视图或系统存储过程,如s
2023-08-18

SQL Server索引碎片维护进阶

一、产生原因及影响索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据,它的重要性体现在能够使数据库引擎快速返回查询结果。当对索引所在的基础数据表进行增删改时,若存储的数据进行了不适当的跨页(SQL Server中存储的最小单
SQL Server索引碎片维护进阶
2020-05-08

SQL Server中的索引怎么使用

本篇内容主要讲解“SQL Server中的索引怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL Server中的索引怎么使用”吧!一、索引的介绍什么是索引?索引是一种磁盘上的数据结构
2023-06-30

SQL Server高级进阶之索引碎片

一、产生原因及影响索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据,它的重要性体现在能够使数据库引擎快速返回查询结果。当对索引所在的基础数据表进行增删改时,若存储的数据进行了不适当的跨页(SQL Server中存储的最小单
SQL Server高级进阶之索引碎片
2020-09-09

SQL Server高级进阶之索引优化

1.1、查找缺失索引SELECT A.USER_SEEKS 查找次数,A.USER_SCANS 扫描次数, ROUND(A.AVG_TOTAL_USER_COST,2) 减少的用户查询的平均成本,A.AVG_USER_IMPACT 可能获得的平均百分比收
SQL Server高级进阶之索引优化
2016-07-26

SQL索引(索引优化)

#1.最左前缀匹配原则,非常重要的原则, create index ix_name_email on s1(name,email,) - 最左前缀匹配:必须按照从左到右的顺序匹配 select * from s1 where name="egon"; #可以
SQL索引(索引优化)
2021-11-01

编程热搜

目录