MSSQL中创建索引、在线创建索引、索引并行、创建索引内存分配

0    77    3

Tags:

👉 本文共约30132个字,系统预计阅读时间或需114分钟。

目录

索引基本操作

查看某个表/视图中存在的索引

1、语法:

exec sp_helpindex 表名/视图名
2、返回代码值:0(成功)或 1(失败)

3、结果值:

列名称 数据类型 说明
index_name sysname 索引名。
index_description varchar (210) 索引说明,其中包括索引所在的文件组。
index_keys nvarchar (2078) 对其生成索引的表或视图列。

创建索引

语法:
CREATE [索引类型] INDEX 索引名称
ON 表名(列名)

创建索引实例:

聚簇索引

create clustered index index_name on table_name (cloumn_name);

非聚簇索引

create nonclustered index index_name on table_name (cloumn_name);

唯一索引

create unique index index_name on table_name(cloumn_name);

删除索引

  可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。

  DROP INDEX index_name ON talbe_name

  ALTER TABLE table_name DROP INDEX index_name

  ALTER TABLE table_name DROP PRIMARY KEY

  其中,前两条语句是等价的,删除掉table_name中的索引index_name。

  第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。

示例

索引并行

在运行 SQL Server Enterprise 或更高版本的多处理器系统上,索引语句可能会像其他查询那样,使用多个处理器 (CPU) 来执行与索引语句关联的扫描、排序和索引操作。 用于运行单个索引语句的 CPU 数由最大并行度服务器配置选项、当前工作负荷以及索引统计信息决定。 max degree of parallelism (MAXDOP)选项决定了执行并行计划时使用的最大处理器数。 如果 SQL Server 数据库引擎 检测到系统忙,索引操作的并行度将自动降低,然后再开始执行语句。 如果非分区索引的第一个键列包含有限数量的非重复值,或者每个非重复值的出现频率变化较大, 数据库引擎 也可能会降低并行度。

限制和局限

  • 查询优化器使用的处理器数量通常能够提供最佳的性能。 但是,有些操作(如创建、重新生成或删除很大的索引)占用大量资源,在索引操作期间会造成没有足够的资源供其他应用程序和数据库操作使用。 出现此问题时,您可以通过限制用于索引操作的处理器数,手动配置用于运行索引语句的最大处理器数。

  • MAXDOP 索引选项只为指定此选项的查询覆盖 max degree of parallelism 配置选项。 下表列出了可为 max degree of parallelism 配置选项和 MAXDOP 索引选项指定的有效整数值。

    说明
    0指定服务器根据当前系统工作负荷确定所使用的 CPU 数目。 这是默认值,还是推荐设置。
    1取消生成并行计划。 操作将以串行方式执行。
    2-64将处理器的数量限制为指定的值。 根据当前工作负荷,可能使用较少的处理器。 如果指定的值大于可用的 CPU 数量,将使用实际可用的 CPU 数量。
  • 并行索引执行和 MAXDOP 索引选项适用于以下 Transact-SQL 语句:

  • 不能在 ALTER INDEX (...) REORGANIZE 语句中指定 MAXDOP 索引选项。

  • 如果查询优化器将并行度应用于生成操作,则需要排序的已分区索引操作的内存需求可能会很大。 并行度越高,内存需求就越大。 有关详细信息,请参阅 Partitioned Tables and Indexes

错误解决

当你创建索引时,你可能会遇到如下错误:

MSSQL中创建索引、在线创建索引、索引并行、创建索引内存分配

消息 8606,级别 17,状态 1,第 7 行

此索引操作要求每个 DOP 有 8192 KB 的内存。16 的 DOP 总共要求 131336 KB 的内存,这大于为高级服务器配置选项 "index create memory (KB)" 设置的 sp_configure 值 1024 KB。请增大此设置的值或减少 DOP,然后重新运行该查询。

这个错误是什么意思呢,我们如何解决这个错误?

一旦你遇到上面的错误,你首先想到的是设置“index create memory(KB)”或者设置dop值来解决问题。但是在哪里设置这些值,并且当你做了这些调整后,会发生什么呢。在我们做任何改变之前,让我们先理解这些服务级别的设置,进而避免影响SQL Server实例上任何其他操作,因为这个改变是实例级别的改变。

创建索引占用内存设置

设置为0时,SQL Server动态分配内存,指定其他值时,为创建索引允许使用的最大内存,默认为0,表示动态分配内存。

MSSQL中创建索引、在线创建索引、索引并行、创建索引内存分配

除图形化界面设置外,我们可以使用如下脚本设置

最佳实践是不改变“index create memory(KB)”默认值0,因为SQL Server默认的会动态分配索引创建需要的内存。如果创建索引需要额外的内存,可用内存取决于服务的内存配置,创建索引将使用已经分配的内存进行索引创建。

创建索引的maxdop值不超过服务器的逻辑处理器个数的一半,防止影响其他业务正常运行。

联机执行索引操作

本主题说明如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中在线创建、重新生成或删除索引。 ONLINE 选项允许并发用户在执行这些索引操作期间访问基础表或聚集索引数据和任何关联非聚集索引。 例如,一个用户正在重新生成聚集索引时,该用户和其他用户可以继续更新和查询基础数据。 当脱机执行数据定义语言 (DDL) 操作(例如,生成或重新生成聚集索引)时,这些操作对基础数据和关联索引持有排他锁。 这样可以防止在索引操作未完成时对基础数据进行修改和查询。

备注

在 SQL Server 的各版本中均不提供联机索引操作。 有关详细信息,请参阅 SQL Server 2022 的版本及其支持的功能

联机索引操作可用于 Azure SQL 数据库和 Azure SQL 托管实例。

限制和局限

  • 建议对于全天候运行的业务环境执行联机索引操作,在这些环境中,在执行索引操作期间必须有并发用户活动。
  • 以下 Transact-SQL 语句中可以使用 ONLINE 选项。
  • 有关联机创建、重新生成或删除索引的更多限制和局限性,请参阅 联机索引操作指南

安全性

权限

要求对表或视图具有 ALTER 权限。

使用 SQL Server Management Studio

联机重新生成索引

  1. 在“对象资源管理器”中,单击加号以便展开包含您要联机重新生成索引的表的数据库。
  2. 展开 “表” 文件夹。
  3. 单击加号以展开您要联机重新生成索引的表。
  4. 展开 “索引” 文件夹。
  5. 右键单击要联机重新生成的索引,然后选择“属性”。
  6. “选择页”下,选择 “选项”
  7. 选择 “允许联机 DML 处理”,然后从列表中选择 True
  8. 单击“确定”。
  9. 右键单击要联机重新生成的索引,然后选择“重新生成”。
  10. “重新生成索引” 对话框中,确认正确的索引位于 “要重新生成的索引” 网格中,然后单击 “确定”

联机创建、重新生成或删除索引

下面的示例在 AdventureWorks 数据库中重新生成现有联机索引。

SQL

以下示例使用 NewGroup 子句联机删除一个聚集索引并将生成表(堆)移动到文件组 MOVE TO 。 在移动之前和之后,将查询 sys.indexessys.tablessys.filegroups 目录视图,以验证索引和表在文件组中的位置。

有关详细信息,请参阅 ALTER INDEX (Transact-SQL)

CREATE INDEX (Transact-SQL)

为表或视图创建相关索引。 也称为行存储索引,因为它可能是聚集或非聚集的 B 树索引。 可以在表中不存在数据时创建行存储索引。 使用行存储索引提高查询性能,尤其是在查询从特定列中进行选择或需要按特定顺序对值进行排序时。

备注

SQL Server 文档在提到索引时一般使用 B 树这个术语。 在行存储索引中,SQL Server 实现了 B+ 树。 这不适用于列存储索引或内存中数据存储。 有关详细信息,请参阅 SQL Server 以及 Azure SQL 索引体系结构和设计指南

Azure Synapse Analytics 和 Analytics Platform System (PDW) 目前不支持唯一约束。 任何引用唯一约束的示例仅适用于 SQL Server 和 SQL 数据库。

有关索引设计指南的信息,请参阅 SQL Server 索引设计指南

示例:

  1. 对表或视图创建非聚集索引

    SQL

  2. 在表上创建聚集索引,并为表使用由 3 个部分组成的名称

    SQL

  3. 使用唯一约束创建非聚集索引并指定排序顺序

    SQL

主要方案:

从 SQL Server 2016 (13.x) 和 SQL 数据库开始,可针对列存储索引使用非聚集索引来提高数据仓库查询性能。 有关详细信息,请参阅列存储索引 - 数据仓库

有关其他类型的索引,请参阅:

Transact-SQL 语法约定

语法

适用于 SQL Server、Azure SQL 数据库和 Azure SQL 托管实例的语法

syntaxsql

后向兼容的关系索引

重要

在 SQL Server 的未来版本中,将删除此后向兼容的关系索引语法结构。 请避免在新的开发工作中使用此语法结构,并计划修改当前使用此功能的应用程序。 改用 中指定的语法结构。

syntaxsql

Azure Synapse Analytics 和并行数据仓库的语法

syntaxsql

备注

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

自变量

UNIQUE

为表或视图创建唯一索引。 唯一索引不允许两行具有相同的索引键值。 视图的聚集索引必须唯一。

无论 IGNORE_DUP_KEY 是否设置为 ON,数据库引擎都不允许为已包含重复值的列创建唯一索引。 否则,数据库引擎会显示错误消息。 必须先删除重复值,然后才能为一列或多列创建唯一索引。 唯一索引中使用的列应设置为 NOT NULL,因为在创建唯一索引时,会将多个 Null 值视为重复值。

CLUSTERED

创建索引时,键值的逻辑顺序决定表中对应行的物理顺序。 聚集索引的底层(或称叶级别)包含该表的实际数据行。 一个表或视图只允许同时有一个聚集索引。

具有唯一聚集索引的视图称为索引视图。 为一个视图创建唯一聚集索引会在物理上具体化该视图。 必须先为视图创建唯一聚集索引,然后才能为该视图定义其他索引。 有关详细信息,请参阅 创建索引视图

在创建任何非聚集索引之前创建聚集索引。 创建聚集索引时会重新生成表中现有的非聚集索引。

如果没有指定 CLUSTERED,则创建非聚集索引。

备注

因为按照定义,聚集索引的叶级别与其数据页相同,所以创建聚集索引和使用 ON partition_scheme_nameON filegroup_name 子句实际上会将表从创建该表时所在的文件组移到新的分区方案或文件组中。 对特定的文件组创建表或索引之前,应确认哪些文件组可用并且有足够的空间供索引使用。

在某些情况下,创建聚集索引可以启用以前禁用的索引。 有关详细信息,请参阅启用索引和约束禁用索引和约束

NONCLUSTERED

创建一个指定表的逻辑排序的索引。 对于非聚集索引,数据行的物理排序独立于索引排序。

无论是使用 PRIMARY KEY 和 UNIQUE 约束隐式创建索引,还是使用 CREATE INDEX 显式创建索引,每个表都最多可包含 999 个非聚集索引。

对于索引视图,只能为已定义唯一聚集索引的视图创建非聚集索引。

如果未另行指定,默认索引类型则为非聚集。

index_name

索引的名称。 索引名称在表或视图中必须唯一,但在数据库中不必唯一。 索引名称必须符合标识符的规则。

column

索引所基于的一列或多列。 指定两个或多个列名,可为指定列的组合值创建组合索引。 在 table_or_view_name 后的括号中,按排序优先级列出组合索引中要包括的列。

一个组合索引键中最多可组合 32 列。 组合索引键中的所有列必须在同一个表或视图中。 对于聚集索引,组合索引值允许的最大大小为 900 字节,对于非聚集索引则为 1,700 字节。 对于 SQL 数据库 和 SQL Server 2016 (13.x) 以前的版本,此限制为 16 列和 900 字节。

无法将 ntext、text、varchar(max)、nvarchar(max)、varbinary(max)、xml 或 image 大型对象 (LOB) 数据类型的列指定为索引的键列。 另外,即使 CREATE INDEX 语句中并未引用 ntext、text 或 image 列,视图定义中也不能包含这些列。

如果 CLR 用户定义类型支持二进制排序,则可以为该类型的列创建索引。 另外,对于已定义为用户定义类型列的方法调用的计算列,只要这些方法标记为确定性方法且不执行数据访问操作,便可为该计算列创建索引。 有关为 CLR 用户定义类型的列创建索引的详细信息,请参阅 CLR 用户定义类型

[ ASC | DESC ]

确定特定索引列的升序或降序排序方向。 默认值为 ASC。

INCLUDE (column [ ,... n ] )

指定要添加到非聚集索引的叶级别的非键列。 非聚集索引可以唯一,也可以不唯一。

在 INCLUDE 列表中列名不能重复,且不能同时用于键列和非键列。 如果对表定义了聚集索引,则非聚集索引始终包含聚集索引列。 有关详细信息,请参阅 Create Indexes with Included Columns

允许除 textntextimage之外的所有数据类型。 从 SQL Server 2012 (11.x) 和 Azure SQL 数据库开始,如果任何一个指定的非键列是 varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型,可使用 ONLINE 选项生成或重新生成索引。

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
MSSQL中创建索引、在线创建索引、索引并行、创建索引内存分配后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章!
验证码:
请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦。
  • 18509239930
  • 个人微信

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部