首页 > 数据库 >8.3 SQL Server非聚集索引

8.3 SQL Server非聚集索引

时间:2023-01-30 10:37:21浏览次数:50  
标签:INDEX 8.3 last name 聚集 customers Server 索引 SQL

SQL Server Non-Clustered Indexes(非聚集索引)

目录

简介

非聚集索引是一种数据结构,可以提高查询速度。与聚集索引不同,非聚集索引将索引数据与表中的数据行分开进行排序和存储。它是表中选定数据列的副本,其中包含指向关联表的链接。

与聚集索引类似,非聚集索引使用B+树结构来组织其数据。

一个表可以有一个或多个非聚集索引,每个非聚集索引可以包含表的一列或多列。

下图说明了非聚集索引的结构:

除了存储索引键值,叶节点还存储指向数据行的行指针。这些行指针也称为行定位器。

如果基础表包含聚集索引,则行指针是聚集索引的键,如果基础表未包含索引(底层还是无序的堆结构),则行指针指向表的行。

使用SQL Server CREATE [NONCLUSTERED] INDEX创建非聚集索引

语法:

CREATE [NONCLUSTERED] INDEX index_name
ON table_name(column_list); 

此语法中:

  • 首先,在CREATE NONCLUSTERED INDEX子句后面指定索引的名字,NONCLUSTERED关键字可以省略
  • 其次,指定要在其上创建索引的表名和该表的列列表作为索引键列。

示例

有如下客户表


因为客户表有主键customer_id,所以是一张聚集表,

A)使用CREATE INDEX语句在一列上添加一个聚集索引

语句查找在阿特沃特的客户:

SELECT 
    customer_id, 
    city
FROM 
    sales.customers
WHERE 
    city = 'Atwater';

如果打开执行计划,你将看到查询优化器是聚集索引扫描(Scan)来查找行,这是因为customers表中没有为city列建索引

要提高查询速度,你可以给city列添加索引:

CREATE INDEX ix_customers_city
ON sales.customers(city);

此时如果再打开执行计划,将会发现查询优化器使用的是非聚集索引(ix_customers_city:)查找(Seek):

B)使用CREATE INDEX语句在多列上添加一个聚集索引

查找姓是伯格,并且名是Monika的客户:

SELECT 
    customer_id, 
    first_name, 
    last_name
FROM 
    sales.customers
WHERE 
    last_name = 'Berg' AND 
    first_name = 'Monika';

查询优化器扫描聚集索引来定位客户。

要提高查询速度,你可以创建包含last_namefirst_name两列的一个非聚集索引:

CREATE INDEX ix_customers_name 
ON sales.customers(last_name, first_name);

现在,查询优化器就会使用索引ix_customers_name来查找客户。

SELECT 
    customer_id, 
    first_name, 
    last_name
FROM 
    sales.customers
WHERE 
    last_name = 'Berg' AND 
    first_name = 'Monika';

创建由多个列组成的非聚集索引时,索引中列的顺序非常重要。您应该将经常用于查询数据的列放在列的开头。

例如,以下查找姓氏(last_name)为Albert的客户。因为last_name是索引中最左边的列,所以查询优化器可以利用索引并使用索引查找方法进行搜索:

SELECT 
    customer_id, 
    first_name, 
    last_name
FROM 
    sales.customers
WHERE 
    last_name = 'Albert';

此语句查找名(first_name)为Adam的客户,它也用到了ix_customer_name索引。但它需要扫描(Scan)整个索引进行搜索,这比索引查找(Seek)慢。

SELECT 
    customer_id, 
    first_name, 
    last_name
FROM 
    sales.customers
WHERE 
    first_name = 'Adam';

因此,最好将经常用于查询数据的列放在索引列列表的开头。

标签:INDEX,8.3,last,name,聚集,customers,Server,索引,SQL
From: https://www.cnblogs.com/michaelshen/p/17074691.html

相关文章

  • 8.4 SQL Server唯一索引
    SQLServer唯一索引(UniqueIndex)目录SQLServer唯一索引(UniqueIndex)简介示例A)创建包含一列的唯一约束B)创建包含多列的唯一约束SQLServer唯一索引与NULL唯一索引(Uniquei......
  • 8.5 SQL Server包含列索引
    SQLServer索引与包括的列目录SQLServer索引与包括的列简介创建包含列的索引的语法简介本文使用sales.customers表作为示例下面语句在email列创建唯一约束:CREATEU......
  • 8.6 SQL Server筛选索引
    SQLServer筛选索引目录SQLServer筛选索引简介示例筛选索引的优点简介如果使用得当,非聚集索引可以大大提高查询性能。然而,非聚集索引的好处是有代价的:存储和维护。......
  • 8.7 SQL Server计算列上的索引
    SQLServer计算列上的索引目录SQLServer计算列上的索引简介计算列索引的要求简介有如下客户表:查找居住在garry.espinoza的客户:SELECTfirst_name,last......
  • 让Windows Server 2008r2 IIS7.5 ASP.NET 支持10万并发请求
    由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误。为了避免这样的错误,我们根据相关文档调整了......
  • docker mysql
    dockerpullmysqldockerrun-itd--namemysql-p3307:3306-eMYSQL_ROOT_PASSWORD=123456mysql--character-set-server=utf8mb4--collation-server=utf8......
  • SQL Server 返回了错误 21(设备未就绪。) 解决方法
    https://www.cnblogs.com/xx_cs/archive/2013/05/31/3110881.html在文件'G:\LedDB\LedDB.mdf' 中、偏移量为0x00000001a9a000 的位置执行 读取 期间,操作系统已经向SQL......
  • MysqlDump导出
    mysqldump常用选项--no-create-db,---取消创建数据库sql(默认存在)--no-create-info,---取消创建表sql(默认存在)--no-data---不导出数据(默认导出)--add-drop......
  • MGR复制架构+自动化运维平台,汽车之家MySQL高可用建设实践
    前言 MySQL具有开源免费,运维简单,性能好等优点,是在汽车之家使用最多的一种数据库。数据库作为应用的后端存储,承担着数据持久化存储的功能,是应用可以正常对外提......
  • mysql第二天
    mysql5.7修改默认字符集由于5.7版本的mysql默认使用latin的字符集,所以在创建表成功后向表中插入中文数据会失败。所以要修改编码方式。在存放mysql的数据文件中找到my.......