首页 > 数据库 >8.5 SQL Server包含列索引

8.5 SQL Server包含列索引

时间:2023-01-30 10:35:38浏览次数:39  
标签:customers 8.5 name sales Server 索引 SQL 查询 email

SQL Server索引与包括的列

目录

简介

本文使用sales.customers表作为示例

下面语句在email列创建唯一约束:

CREATE UNIQUE INDEX ix_cust_email 
ON sales.customers(email);

查找电子邮件为“[email protected]”的客户:

SELECT    
    customer_id, 
    email
FROM    
    sales.customers
WHERE 
    email = '[email protected]';

打开执行计划,您会发现查询优化器使用的是非聚集索引查找(Index Seek)操作,这样的查找性能来很高。

然而,请看下面语句:

SELECT    
	first_name,
	last_name, 
	email
FROM    
	sales.customers
WHERE email = '[email protected]';

在这个执行计划中:
首先,查询优化器使用email列的非聚集索引ix_cust_email上的索引查找来查找emailcustomer_id

其次,查询优化器使用sales.customers表的聚集索引的键查找。按客户id(customer_id)查找客户的名字(first_name)和姓氏(last_name)。

第三,对于在非聚集索引中找到的每一行,它使用嵌套循环与聚集索引中发现的行相匹配。

可以清晰的看到,键查找的开销约为查询的50%,这个开销很大。

为了帮助减少这种键查找开销,SQL Server可以通过包含非键列来增加非聚集索引包含的列。

通过在非聚集索引中包含非键列,可以创建覆盖更多查询的非聚集索引。

注意,当索引包含查询引用的所有列时,这样的查询通常称为覆盖查询。

首先,从sales.customers表中删除email列上的非聚集索引ix_cust_email

DROP INDEX ix_cust_email 
ON sales.customers;

然后,在email列上创建一个新索引ix_cust_email_inc,并额外包括两列first_namelast_name

CREATE UNIQUE INDEX ix_cust_email_inc
ON sales.customers(email)
INCLUDE(first_name,last_name);

现在,查询优化器将只使用非聚集索引来返回查询的请求数据:

包含列的索引可以大大提高查询性能,因为查询中的所有列都包含在索引中;查询优化器可以定位索引中的所有列值,而无需访问表或聚集索引,从而减少磁盘I/O操作。

键列存储在索引的所有级别中,而非键列仅存储在叶级别中。

注意:键列存储在索引的所有级别中,而非键列仅存储在叶级别中。

创建包含列的索引的语法

CREATE [UNIQUE] INDEX index_name
ON table_name(key_column_list)
INCLUDE(included_column_list);

标签:customers,8.5,name,sales,Server,索引,SQL,查询,email
From: https://www.cnblogs.com/michaelshen/p/17074710.html

相关文章

  • 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.......
  • Mysql数据库插入数据时出现Unknown column ‘admin‘ in ‘field list‘错误
    报错内容  报错原因字段和插入的值所用的引号不对 解决方案 insertintot_user(`username`,`password`,`email`)VALUES(`admin`,`admin`,`[email protected]......
  • mysql第一天
    mysql启动和停止命令netstartmysqlnetstopmysql电脑安装两个mysql数据库下分情况登录旧版本和新版本:使用命令:mysql-uroot-P(端口号)-p根据端口号的不同登录......