聚集索引VS非聚集索引

聚集索引VS非聚集索引

SQL Server 2014

发布日期: 2016年12月

索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。 索引包含由表或视图中的一列或多列生成的键。 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。

表或视图可以包含以下类型的索引:

  • 群集
    • 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。 索引定义中包含聚集索引列。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。
    • 只有当表包含聚集索引时,表中的数据行才按排序顺序存储。 如果表具有聚集索引,则该表称为聚集表。 如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。
  • 非聚集
    • 非聚集索引具有独立于数据行的结构。 非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。
    • 从非聚集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页是存储在堆中还是聚集表中。 对于堆,行定位器是指向行的指针。 对于聚集表,行定位器是聚集索引键。
    • 您可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。 有关详细信息,请参阅 Create Indexes with Included Columns

聚集索引和非聚集索引都可以是唯一的。 这意味着任何两行都不能有相同的索引键值。 另外,索引也可以不是唯一的,即多行可以共享同一键值。 有关详细信息,请参阅 创建唯一索引

每当修改了表数据后,都会自动维护表或视图的索引。

有关其他类型的特殊用途索引,请参阅 Indexes 。

索引和约束

对表列定义了 PRIMARY KEY 约束和 UNIQUE 约束时,会自动创建索引。 例如,如果创建了表并将一个特定列标识为主键,则 数据库引擎 自动对该列创建 PRIMARY KEY 约束和索引。 有关详细信息,请参阅 Create Primary Keys 和 Create Unique Constraints

查询优化器如何使用索引

设计良好的索引可以减少磁盘 I/O 操作,并且消耗的系统资源也较少,从而可以提高查询性能。 对于包含 SELECT、UPDATE、DELETE 或 MERGE 语句的各种查询,索引会很有用。 例如,在 SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 数据库中执行的查询 AdventureWorks2012 。 执行此查询时,查询优化器评估可用于检索数据的每个方法,然后选择最有效的方法。 可能采用的方法包括扫描表和扫描一个或多个索引(如果有)。

扫描表时,查询优化器读取表中的所有行,并提取满足查询条件的行。 扫描表会有许多磁盘 I/O 操作,并占用大量资源。 但是,如果查询的结果集是占表中较高百分比的行,扫描表会是最为有效的方法。

查询优化器使用索引时,搜索索引键列,查找到查询所需行的存储位置,然后从该位置提取匹配行。 通常,搜索索引比搜索表要快很多,因为索引与表不同,一般每行包含的列非常少,且行遵循排序顺序。

查询优化器在执行查询时通常会选择最有效的方法。 但如果没有索引,则查询优化器必须扫描表。 您的任务是设计并创建最适合您的环境的索引,以便查询优化器可以从多个有效的索引中选择。 SQL Server 提供 数据库引擎优化顾问 以帮助分析数据库环境并选择适当的索引。

https://msdn.microsoft.com/zh-cn/library/ms190457(v=sql.120).aspx

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

文件句柄与文件描述符

1.概述 在实际工作中会经常遇到一些bug,有些就需要用到文件句柄,文件描述符等概念,比如报错: too many open files, 如果你对相关知识一无...

2596
来自专栏程序员互动联盟

【答疑释惑第三十六讲】Windows下如何调试?

疑惑一 Windows窗口程序到底能不能用printf? 很多小伙伴在控制台下写程序时,要打印或者调试很方便,用printf就可以直接打印输出,方便看结果,但是...

2544
来自专栏积累沉淀

Linux软连接和硬链接

1.Linux链接概念 一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法 Linux链接分两种,一种被称为硬链接(Hard Link),另一种...

1787
来自专栏青玉伏案

Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)

前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架。本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在《Swift...

2027
来自专栏武军超python专栏

2018年7月23日python系统模块os和文件io

今天遇到的新单词: attrubute:    n属性 cwd全称:     Current Working Directory当前工作目录 argume...

1035
来自专栏coder修行路

Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法

当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的python类,...

25410
来自专栏偏前端工程师的驿站

MyBatis魔法堂:Insert操作详解(返回主键、批量插入)

一、前言                                      数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT...

4858
来自专栏逆向技术

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

       32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 一丶32位汇编编写Windows窗口程序 首先我们知道32位汇编是可以调...

2068
来自专栏更流畅、简洁的软件开发方式

【自然框架】元数据的数据库结构的详细说明和示例(一):项目描述部分

1、 Manage_Function(节点信息) 字段名 中文名 类型 大小 默认值 说明 FunctionID 节点ID int 4 1 主键 Pa...

2208
来自专栏Java与Android技术栈

用kotlin打印出漂亮的android日志(二)

前面我已经写过一篇这个标题的文章,因为当时的代码还存在一些bug,并没有把这个项目放到github上我总觉得有一丝遗憾,这次修复了bug加了一些新功能还折腾了半...

622

扫码关注云+社区