SQLServer索引的四个高级特性

SQL Server对象类型(4)——索引视图(Indexed View) 本文对SQL Server中对象———索引视图(INDEXED VIEW)的概念与机制进行了较为深入详细的说明和讲解。 阅读详情

SQLServer索引的四个高级特性

 

一、Index Building Filter(索引创建时过滤)
    

        有一些索引非常低效的,比如经常查询状态为进行中的订单,订单有99%的状态是完成,1%是进行中 ,因此我们在订单状态字段上建了一个索引,性能是提高了,但是感觉索引中保存了99%的完成状态数据是永远不会查询到的,很浪费空间。如果我们的索引在建立的时间就不保存完成状态的数据,那不是更好。 Index Building Filter就是用来解决这个问题。

SQLServer
支持,语法示例:

create index idx_3 on order(status) where status=’running’

MySQL:不支持

Oracle:不支持,可以考虑用分区解决


二、Index Include Column(索引包含列)

我们经常需要建一些组合索引,一般有两种原因:
1.通过组合索引可以提高索引过滤度
    比如订单表有会员ID和订单日期2个字段,如果我们经常要按会员和订单时间查询,

Select * from order where member_id=? and order_date between ? and ?

那建立会员ID+订单日期的索引很合适。

create index idx_1 on order(member_id,order_date);

2.索引覆盖读取
    比如我们需要读取一个会员订单的订单ID+状态列表,SQL如下:

select order_id,status from order where member_id=?


如果我们的索引中只有member_id字段,那么还需要回表查询order_id和status数据才能返回结果,如果建一个member_id+order_id+status的组合索引:

create index idx_2 on order(member_id,order_id,status);


 

那只要访问索引就可以返回数据了,这种虽然性能提高了,但是由于索引多了字段,因此增加了索引建立成本和索引空间。

SQLServer

        SQLServer除了支持组合索引外,还支持Index Include Column特性,Index Include Column是组合索引的一种变种,它的特点是可以指定组合索引中哪些列是排序列,哪些列只是把内容存储在索引中,这个特性不仅可以满足索引覆盖读取,而且可以减少索引对DML的性能影响。语法如:

create index idx_2 on order(member_id) include(order_id,status);

其中member_id字段是普通索引列,order_id和status列是内容include列。

普通组合索引数据存储结构示例:
 
Include Column组合索引数据存储结构示例:
 

SQLServer管理器的SQL优化自动索引推荐就经常看到推荐Include Column方式。

MySQL:不支持,只能用组合索引代替
Oracle:不支持,只能用组合索引代替


三、聚集索引(Cluster Index)

数据库通常用两种存储方式,一种是堆表,即表中的数据是基本无序的,像往一个房间(数据块)堆箱子(记录)一样,只要有空间就往里面放,放满了就准备一个新房间再放。

另外一种就是聚集存储,数据按表中一个或几个字段排序存储,如下图所示。

 

由于要排序,需要索引来保证效率,所以聚集存储和聚集索引存储通常指一个意思。

SQLServer
        如果表没有主键默认为堆表,如果有主键默认为按主键聚集存储。SQLServer支持非主键索引聚集存储,这个特性非常有意义,比如订单表有订单ID(主键)和会员ID,如果按订单ID聚集存储,由于订单ID一般都是随机访问,返回单条记录,所以对按订单ID查询没有什么性能提高。假设需按会员ID查询,一个会员有许多订单,分页一次返回20条,那就需要20次离散数据访问。
如果可以按会员ID聚集存储,那用会员ID查询可能只需要1次离散数据访问就可以,性能可以提升很多,这种方式对订单插入有一些性能影响,如果订单插入不多,按会员查询频繁,那按会员ID建聚集索引给用订单ID聚集效果很好。
MySQL
       MySQL MYISAM存储引擎只支持堆存储,不支持聚集索引。
       MySQL INNODB存储引擎只能按主键聚集,如果没有主键就用一个内部隐藏主键代替。

Oracle
       Oracle默认是堆存储,如果建成索引组织表则按主键聚集存储。Oracle还有一个种更高级的聚集存储,概念叫簇(Cluster),可以定义一个簇对象,然后将一个或多个表按字段顺序聚集的存储在这个簇中,从而实现多个表聚集存储,适用于一些主从表,如订单与订单明细,它们的数据是按关联字段聚集的存储在一个数据块中,订单与订单明细经常一起查询,所以这种逻辑只要读取一次数据块即可,如果用非Cluster,那需要读取多个数据块才OK。

 

四、VIEW INDEX(视图索引)

在视图上建索引,感觉没有意义,因为视图本身就是一个逻辑的概念,并不存储物理数据,何来索引之说。

SQLServer
支持。视图上建索引首先视图需要绑定架构。视图上需要先建一个唯的聚集索引,把数据持久化,持久化后还可以建其它新的索引,像普通表一样处理了。

视图上建索引可以让数据持久化,一般有两种用途
1. 统计类数据查询性能优化
如经常要做select sum(amount) from t2这样的操作,性能不好优化,并且t表数据变化不多,那么可以建一个视图(注意:需要加上with schemabinding选项):

CREATE VIEW V2
with schemabinding
AS
SELECT     SUM(amount) as sum_amount,COUNT_BIG (*) as cnt
FROM         t2

然后在这个视图上建一个唯一聚集索引,数据就持久化了。

CREATE UNIQUE CLUSTERED INDEX idx_4 ON V2 (sum_amount)

然后我们用noexpand方式查询v2索引视图,如下:

SELECT  sum_amount FROM  v2 WITH(NOEXPAND)

性能会非常好,因为视图里只有一行数据,直接读取即可,不需要再从t2全表扫描汇总。

2.自动实现多维度聚集存储
        数据库的表一般只能设计为按一种方式聚集存储(只允许有一个聚集索引),但在实际业务中存在一些多个维度的查询,比如交易表,需要按买家维度查询,也需要按卖家维度查询。普通表只能选择一种,如果要两种维度性能都很好很难,有时只能人工的分为两张表,一张表按买家聚集,一张表按卖家聚集,用程序或触发器维护两张表数据的一致性,这样看起来很别扭。采用视图索引后可以在主表(买家维度表)上建个视图,然后在视图上用卖家维度建聚集索引,以后如果要按买家查询则查询主表,如果按卖家查询才查询索引视图。
这种性能优化方式只是一个方案设计,实践中没有经过验证。

MySQL:不支持
Oracle:不支持,物化视图可以起到类似的作用,并提供了更多的数据同步控制特性。


2013/3/25

我的新浪微博(http://weibo.com/yzsind)

SQL Server 索引中include的魅力(具有包含性列的索引) 此文档中详细的记载了,SQL Server 索引中include的魅力(具有包含性列的索引),希望可以帮到下载的朋友们! 立即下载

相关推荐

不止是打字机效果:手把手教你用SpannableStringBuilder打造Android富文本AI对话界面

本文详细介绍了如何使用SpannableStringBuilder在Android平台上构建专业级AI对话界面,涵盖流式文本处理、富文本解析、交互优化等核心技术。通过实战代码示例,帮助开发者实现类似DeepSeek的AI产品交互效果,提升用户体验和应用专业度。

weixin_28358083的博客 198

Create Index语句的Include作用

在 SQL Server 2005 中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。通过包含非键列,可以创建覆盖更多查询的非聚集索引。这是因为非键列具有下列优点: 它们可以是不允许作为索引键列的数据类型。  在计算索引键列数或索引键大小时,数据库引擎 不考虑它们。 当查询中的所有列都作为键列或非键列包含在索引中时,带有包含性非键列的索引可以显著提高查

guaiguaigirlma的专栏 2044

Python实战:ERA5风场数据区域提取与风向合成可视化全流程解析

本文详细解析了使用Python处理ERA5风场数据的完整流程,包括NC文件读取、特定区域数据提取、u/v分量合成风向风速的计算,以及利用Matplotlib进行风场时空演变可视化。内容涵盖从环境搭建、数据获取到高级绘图与性能优化的实战经验,为气象数据分析、风能评估及气候研究提供了一套清晰、可操作的技术指南。

swift5iosmith的博客 301

Sql Server关于create index include带有包含列的索引的最全解释

官方文档 https://docs.microsoft.com/zh-cn/sql/relational-databases/indexes/create-indexes-with-included-columns?view=sql-server-2017 https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-indexes-with-included-columns?view=sql-server-2017 在Sq

lusklusklusk的博客 2360

AU混响终极指南:从‘干声’到‘空间感’,用总音轨和发送技巧打造专业人声

本文详细介绍了如何在Adobe Audition(AU)中使用混响效果器,通过总音轨和发送技巧将‘干声’转化为具有专业‘空间感’的人声。从混响基础原理到总线架构设置,再到精细控制和自动化调整,全面解析了提升音频质量的实用技巧,适用于音乐制作、播客和内容创作。

weixin_30512089的博客 332

ENU坐标系实战:5分钟搞定无人机导航中的站心坐标转换

本文针对无人机导航中GPS坐标与视觉感知不匹配的定位漂移问题,提供了基于ENU坐标系的实战解决方案。通过Python代码演示了如何快速、精准地实现地心地固坐标与站心坐标之间的转换,并详细解释了转换原理、精度对比及工程优化技巧,帮助开发者从根本上解决局部相对定位不准的难题。

mqtt6iot的博客 552

SQL Server索引中的include列

一、 几个概念 覆盖索引 返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不会发生Bookup Lookup,因为找到索引项,就已经找到所需的数据了,没有必要再到数据行去找了。 复合索引 复合索引就是包含两个或者多个字段的索引 非键列 键列就是在索引中所包含的列,当然非键列就是该索引之外的列了 二、2005的新特性 在 SQL Serve...

Hehuyi_In的博客 6491

Win11下USB-Blaster驱动安装全攻略:Quartus用户必看(附常见问题解决)

本文详细介绍了在Windows 11系统下为Intel FPGA开发工具Quartus安装USB-Blaster驱动的完整流程与常见问题解决方案。针对Win11更严格的驱动签名验证机制,提供了从标准安装步骤到高级故障排查(如禁用驱动强制签名、使用测试模式)的实用指南,帮助用户快速解决驱动安装失败问题,确保FPGA编程调试顺利进行。

weixin_29256771的博客 660

SQLServer索引的四个高级特性 .

SQLServer索引的四个高级特性   一、Index Building Filter(索引创建时过滤)              有一些索引非常低效的,比如经常查询状态为进行中的订单,订单有99%的状态是完成,1%是进行中 ,因此我们在订单状态字段上建了一个索引,性能是提高了,但是感觉索引中保存了99%的完成状态数据是永远不会查询到的,很浪费空间。如果我们的索引在建立的时间就不保存完

zzy7075的专栏 797

腾讯滑块验证码collect参数逆向与JSVMP对抗实战

本文深入解析腾讯滑块验证码collect参数的逆向过程与JSVMP虚拟机对抗技术。通过详细的环境搭建、抓包分析和JSVMP逆向技巧,揭示collect参数的生成逻辑与加密流程,并提供完整的模拟实现方案和常见问题排查方法,助力开发者突破腾讯天御验证码的防护机制。

weixin_29009501的博客 1573

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

Robot_PLC_HMI_Automation 1万+

[转]SQLServer索引的四个高级特性

转自:http://blog.youkuaiyun.com/yzsind/article/details/8719594

weixin_34007906的博客 91

YOLO26改进策略【Neck】| CVPR2025 LCA轻量交叉注意力 跨层级双向引导 + 分层降噪增强,提升微小目标特征表达

简单相加、拼接融合无法建立深浅层双向约束关系,浅层微小目标易被深层背景覆盖,深层全局信息难以修正浅层噪声;普通单路自注意力仅单一层内建模依赖,缺少跨层级特征互引导机制,深浅特征信息割裂;标准多头跨注意力计算量大、参数量高,轻量化单模态检测/分割网络部署困难,无法区分前景目标与背景噪声。为此设计单模态轻量化交叉注意力LCA,构建浅层细节、深层语义双分支双向引导结构,轻量完成跨层级特征交互,同步降噪并强化单模态微小目标特征。

Limiiiing的博客 523

非聚集索引结构

http://msdn.microsoft.com/zh-cn/library/ms177484.aspx SQLServer索引的四个高级特性 http://blog.youkuaiyun.com/yzsind/article/details/8719594

HkEndless的专栏 711

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SQLServer索引

SQLServer索引,SQlServer执行计划

weixin_43159131的博客 4098

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SQLServer索引全解

索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间

weixin_43295327的博客 3731

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 关于12306——传统信息化系统面向互联网应用的挑战
下一篇: mysql时间相减的问题(bug)
yzsind
博客等级 码龄25年 1925粉丝 328原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值