广告
返回顶部
首页 > 资讯 > 数据库 >【SQL SERVER】索引
  • 802
分享到

【SQL SERVER】索引

【SQLSERVER】索引 2019-05-21 15:05:54 802人浏览 猪猪侠
摘要

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

【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 

 

您可能感兴趣的文档:

--结束END--

本文标题: 【SQL SERVER】索引

本文链接: https://www.lsjlt.com/news/5326.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 【SQL SERVER】索引
    在做开发过程中经常会接触数据库索引,不只是DBA才需要知道索引知识,了解索引可以让我们写出更高质量代码。简单介绍索引的概述,聚集索引,非聚集索引,唯一索引,复合索引,筛选索引使用及注意事项 在做开发过...
    99+
    2019-05-21
    【SQL SERVER】索引
  • SQL Server索引维护的sql语句
    这篇文章主要介绍“SQL Server索引维护的sql语句”,在日常操作中,相信很多人在SQL Server索引维护的sql语句问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-18
  • SQL Server 全文搜索/全文索引
    全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类型的基于标记的功能性索引,它是由 SQL Server 全文引...
    99+
    2014-12-30
    SQL Server 全文搜索/全文索引
  • SQL Server 2014的重建索引
    对于表的index来说,如果这个表的index size非常大的话,建议对这个表的index单独重建索引。 对全表做重建索引: alter index all on Table rebuild w...
    99+
    2022-10-18
  • SQL Server索引有什么用
    这篇文章给大家分享的是有关SQL Server索引有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。索引的概念索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准...
    99+
    2022-10-18
  • SQL Server索引的示例分析
    小编给大家分享一下SQL Server索引的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言此文是我之前的笔记整理而来...
    99+
    2022-10-18
  • Sql Server 中怎么优化索引
    Sql Server 中怎么优化索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代码如下: --Begin Index(索引) 分析优...
    99+
    2022-10-18
  • SQL server 数据库之“索引”详解
    什么是索引?数据库中的索引与书籍中的目录类似,索引使SQL Server编排数据的内部方法,它为SQL Server提供一种方法来编排查询数据的路由。 索引页是数据中存储索引的数据页。索引页存放检索数据...
    99+
    2022-10-18
  • SQL Server 索引的含义和特点
    索引用于快速找出在某个列中某一特定值的行。不使索引,数据库必须从第一条记录开始读完整个表,直到找到相关行。如果表中查询的列有一个索引,数据库能快速到达一个位置去搜寻数据,而不必查看所有数据。 索引的含义和特点: 索引是一个单独的、...
    99+
    2018-08-17
    SQL Server 索引的含义和特点
  • SQL Server索引优化常用查询
    1.1、查找缺失索引 SELECT A.USER_SEEKS 查找次数,A.USER_SCANS 扫描次数, ROUND(A.AVG_TOTAL_USER_COST,2) 减少的用户查询的平均成本,A.AVG_USER_...
    99+
    2014-10-16
    SQL Server索引优化常用查询
  • SQL Server索引碎片维护进阶
    一、产生原因及影响 索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据,它的重要性体现在能够使数据库引擎快速返回查询结果。当对索引所在的基础数据表进行增删改时,若存储的数据进行了不适当的跨页(SQL S...
    99+
    2020-05-08
    SQL Server索引碎片维护进阶
  • SQL Server中的索引怎么使用
    本篇内容主要讲解“SQL Server中的索引怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL Server中的索引怎么使用”吧!一、索引的介绍什么是索引?索引是...
    99+
    2023-06-30
  • SQL Server中的索引怎么使用
    在SQL Server中,索引可以提高查询性能,加快数据的检索速度。下面是一些使用索引的常见方法:1. 创建索引:在需要加速查询的列...
    99+
    2023-08-18
    SQL Server
  • SQL Server中索引的用法详解
    索引是一种数据结构,用于提高数据库中数据的查询效率。SQL Server中的索引可以分为聚集索引和非聚集索引两种类型。聚集索引决定了...
    99+
    2023-08-17
    SQL Server
  • SQL Server高级进阶之索引碎片
    一、产生原因及影响 索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据,它的重要性体现在能够使数据库引擎快速返回查询结果。当对索引所在的基础数据表进行增删改时,若存储的数据进行了不适当的跨页(SQL S...
    99+
    2020-09-09
    SQL Server高级进阶之索引碎片
  • SQL Server高级进阶之索引优化
    1.1、查找缺失索引 SELECT A.USER_SEEKS 查找次数,A.USER_SCANS 扫描次数, ROUND(A.AVG_TOTAL_USER_COST,2) 减少的用户查询的平均成本,A.AVG_USER_...
    99+
    2016-07-26
    SQL Server高级进阶之索引优化
  • SQL Server --堆表和索引表的区别
    概念:1. 堆表(heap table)数据插入时时存储位置是随机的,主要是数据库内部块的空闲情况决定,获取数据是按照命中率计算,全表扫表时不见得先插入的数据先查到。2. 索引表(iot)数据存储是把表按照...
    99+
    2022-10-18
  • SQL Server索引结构的具体使用
    目录名词介绍索引表数据页索引是数据库的基础,只有先搞明白索引的结构,才能搞明白索引运行的逻辑 本文通过 索引表、数据页、执行计划、IO统计、B+Tree 来尽可能的介绍 SQL 语句...
    99+
    2022-11-13
  • 详解SQL Server表和索引存储结构
    本文详细分析了SQL Server中表和索引结构存储的原理以及对于如何加快搜索速度和提高效率等方面做了详细的分析,以下是主要内容。 下图显示了表的存储组织,每张表有一个对应的对象ID,并且包含一个或多个分区...
    99+
    2022-10-18
  • SQL Server索引优化的方法是什么
    这篇“SQL Server索引优化的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SQL Server索引优化的方...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作