一、前言

在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思。这里我就里面的一些概念进行讲解,方便大家的交流。

SQL Server 解读【已分区索引的特殊指导原则】(1)- 索引对齐

SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区

二、解读

【对非聚集索引进行分区】

“对唯一的非聚集索引进行分区时,索引键必须包含分区依据列。对非唯一的非聚集索引进行分区时,默认情况下 SQL Server 将分区依据列添加为索引的非键(包含性)列,以确保索引与基表对齐。如果索引中已经存在分区依据列,SQL Server 将不会向索引中添加分区依据列。“

(一) “对唯一的非聚集索引进行分区时,索引键必须包含分区依据列。“对唯一的非聚集索引进行分区,首先它是有唯一约束的,你可以参考:SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区

(二) 其实上面这个描述中,我最关心的是否真的会默认创建包含性列?下面我们进行测试:

1) 创建一个名为[ClassifyResult]的分区表,这个分区方案是以[ClassId]作为分区依据列,[Id]+ [ClassId]作为聚集索引,并且是主键(唯一约束),

--创建测试表
CREATE TABLE [dbo].[ClassifyResult]([Id] [bigint] IDENTITY(1,1) NOT NULL,[ClassId] [int] NOT NULL CONSTRAINT [DF_ClassifyResult_ClassID]  DEFAULT ((0)),[ArchiveId] [int] NOT NULL CONSTRAINT [DF_ClassifyResult_ArchiveID]  DEFAULT ((0)),[Url] [nvarchar](400) NOT NULL CONSTRAINT [DF_ClassifyResult_Url]  DEFAULT (''),CONSTRAINT [PK_ClassifyResult] PRIMARY KEY CLUSTERED
([Id] ASC,[ClassId] ASC
) ON [Sch_ClassifyResult_ClassId]([ClassId]),CONSTRAINT [IX_ClassifyResult_Temp_ClassIdUrl] UNIQUE NONCLUSTERED
([ClassId] ASC,[Url] ASC
)WITH (IGNORE_DUP_KEY = ON) ON [Sch_ClassifyResult_ClassId]([ClassId])
) ON [Sch_ClassifyResult_ClassId]([ClassId])

2) 为[ClassifyResult]创建一个非唯一的非聚集索引:[IX_ClassifyResult_ArichiveId],这个索引键值只有一个:[ArchiveId],并且使用了和表一样的分区方案。

--创建一个非唯一的非聚集索引
CREATE NONCLUSTERED INDEX [IX_ClassifyResult_ArichiveId] ON [dbo].[ClassifyResult]
([ArchiveId] ASC
) ON [Sch_ClassifyResult_ClassId]([ClassId])

3) 按照“对非唯一的非聚集索引进行分区时,默认情况下 SQL Server 将分区依据列添加为索引的非键(包含性)列,以确保索引与基表对齐。“的说法,上面创建索引的SQL语句就等同于下面的SQL语句:

--创建一个非唯一的非聚集索引(include)
CREATE NONCLUSTERED INDEX [IX_ClassifyResult_ArichiveId] ON [dbo].[ClassifyResult]
([ArchiveId] ASC
)INCLUDE([ClassId]) ON [Sch_ClassifyResult_ClassId]([ClassId])

4) 下面就来验证上面的说法是否正确,应该怎么验证呢?首先你需要了解INCLUDE有什么作用:SQL Server 索引中include的魅力(具有包含性列的索引),所以我们就测试在Select时候返回不同的列值时候的执行计划。执行计划如Figure1所示:

--SQL_1查询返回[Id]和[ArchiveId]
SELECT top 10 [Id],[ArchiveId]
FROM [ClassifyResult]
where ArchiveId = 107347

(Figure1:执行计划)

(Figure2:索引查找的详细信息)

5) Figure1是上面SQL_1语句的执行计划,从中可以看出为了返回Id值,SQL Server需要通过【键查找】检索Id值;使用下面的SQL_2返回[ClassId]和[ArchiveId],如果真的如:“默认情况下 SQL Server 将分区依据列添加为索引的非键(包含性)列”所说的那样,那么SQL_2就会只使用[IX_ClassifyResult_ArichiveId]索引就能返回[ClassId]和[ArchiveId]两个字段的值了,SQL_2的执行计划如Figure3所示:

--SQL_2查询返回[ClassId]和[ArchiveId]
SELECT top 10 [ClassId],[ArchiveId]
FROM [ClassifyResult]
where ArchiveId = 107347

(Figure3:执行计划)

6) 对非唯一的非聚集索引进行分区时,默认情况下 SQL Server 将分区依据列添加为索引的非键(包含性)列,以确保索引与基表对齐。”为什么放到包含列就能保证对齐呢?

三、参考文献

已分区索引的特殊指导原则

Special Guidelines for Partitioned Indexes

SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区相关推荐

  1. Sql Server之旅——第四站 你必须知道的非聚集索引扫描

    非聚集索引,这个是大家都非常熟悉的一个东西,有时候我们由于业务原因,sql写的非常复杂,需要join很多张表,然后就泪流满面了...这时候就有DBA或者资深的开发给你看这个猥琐的sql,通过执行计划一 ...

  2. SQL Server 聚集索引(clustered index)和非聚集索引(nonclustered index)

    我们可以把索引理解为一种特殊的目录.SQL SERVER提供了:聚集索引(clustered index)和非聚集索引(nonclustered index). 我们一般把常出现在 WHERE , G ...

  3. Sql Server之旅——第三站 解惑那些背了多年聚集索引的人

    说到聚集索引,我想每个码农都明白,但是也有很多像我这样的伪程序员,只能用死记硬背来解决这个问题,什么表中只能建一个聚集索引,然后又扯到了目录查找来帮助读者记忆....问题就在这里,我们不是学文科,,, ...

  4. SQL Server的聚集索引和非聚集索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)-- (一) ...

  5. [转]聚集索引和非聚集索引(sql server索引结构及其使用)

    聚集索引和非聚集索引(sql server索引结构及其使用) [来自]http://www.cnblogs.com/xinqqing83/archive/2006/10/31/545747.html ...

  6. SQL Server 深入解析索引存储(非聚集索引)

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...

  7. SQL Server中的聚集索引(clustered index) 和 非聚集索引 (non-clustered index)

    1. 什么是聚合索引(clustered index) / 什么是非聚合索引(nonclustered index)? 2. 聚合索引和非聚合索引有什么区别? 深入浅出理解索引结构 实际上,您可以把索 ...

  8. [转]SQL Server 索引基础知识(2)----聚集索引,非聚集索引

    SQL Server 索引基础知识(2)----聚集索引,非聚集索引 [来自]http://blog.joycode.com/ghj/archive/2008/01/02/113291.aspx 由于 ...

  9. sql查询初学者指南_面向初学者SQL Server查询执行计划–非聚集索引运算符

    sql查询初学者指南 Now that we understand what Clustered Index Scan and Clustered Index Seek are, how they o ...

最新文章

  1. Linux/Unix中的重定向简单实例
  2. Spring Boot 整合Redis 实现缓存
  3. 一次心血来潮的C程序编译 makefile
  4. ASP.NET2.0服务器控件之类型化样式属性
  5. 机器学习基础-集成学习-13
  6. 基础 - jQuery选项卡
  7. dedecms 制作模板中使用的全局标记介绍
  8. PowerDesigner 把Comment写到name中 和把name写到Comment中 pd7以后版本可用
  9. 服务端高并发分布式架构演进之路(转载,图画的好)
  10. java 连接 sftp失败_java – 文件上传到SFTP失败(Apache VFS)
  11. Java 常用语法和数据结构
  12. 51Nod-1011 最大公约数GCD【欧几里得算法】
  13. 基于CentOS7.2安装Kubernetes-v1.2
  14. 使用Java复制文件并在控制台显示文件进度
  15. 破局人工智能:构建AI,与腾讯云一起探索语音应用场景
  16. 笔记本电脑连不上windows无线服务器,笔记本电脑连不上无线如何解决
  17. 机器学习(11)——时间序列分析
  18. 基于IPFS视频存储的在线视频网站
  19. C++如何限制模板类的类型
  20. 如何在计算机桌面上添加小工具,怎么在电脑的桌面小工具里添加便签

热门文章

  1. 什么原因接触接触impala的
  2. 初识-Android之智能短信项目相关技术整理
  3. VS2005 Web Application Project启用WSE(Ver 3.0)的方法
  4. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、单总线获取DHT11模块温湿度并通过IIC显示到屏幕(软件IIC)
  5. 全国计算机等级考试题库二级C操作题100套(第45套)
  6. python自动获取cookie_selenium3+python自动化12-cookie相关操作(获取和删除)
  7. linux mysql 修改root密码_Mac下重置mysql的root密码
  8. getAndIncrement中使用cas
  9. java怎么表示正无穷大_有什么比无穷大更大,比无穷小更小?
  10. MYSQL多字段分组having子句