一、前言

在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之旅——第三站 解惑那些背了多年聚集索引的人

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

  3. SQL Server 索引和表体系结构(非聚集索引)

    非聚集索引 概述 对于非聚集索引,涉及的信息要比聚集索引更多一些,由于整个篇幅比较大涉及接下来的要写的“包含列的索引”,“索引碎片”等一些知识点,可能要结合起来阅读理解起来要更容易一些.非聚集索引和聚 ...

  4. SQL SERVER 索引之聚集索引和非聚集索引的描述

    索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度. 索引包含由表或视图中的一列或多列生成的键. 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关 ...

  5. SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 <第八篇>

    聚集索引.非聚集索引.非聚集唯一索引 我们都知道建立适当的索引能够提高查询速度,优化查询.先说明一下,无论是聚集索引还是非聚集索引都是B树结构. 聚集索引默认与主键相匹配,在设置主键时,SQL Ser ...

  6. SQL SERVER大话存储结构(2)_非聚集索引如何查找到行记录

              如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持!      1 行记录如何存储     这里引入两个 ...

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

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

  8. SQL Server - 索引详细教程 (聚集索引,非聚集索引)

    转载自:https://www.cnblogs.com/hyd1213126/p/5828937.html 作者:爱不绝迹 (一)必读:深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录. ...

  9. 浅谈sql server聚集索引与非聚集索引

    今天同事的服务程序在执行批量插入数据操作时,会超时失败,代码debug了几遍一点问题都没有,SQL单条插入也可以正常录入数据,调试了一上午还是很迷茫,场面一度很尴尬,最后还是发现了问题的根本,原来是另 ...

随机推荐

  1. 本地xdebug调试搭建 Laravel+homestead+phpstorm

    1.在homestead virtual box安装和配置xdebug 先在终端运行vagrant up 和 vagrant ssh,ssh远程到homestead,然后复制以下代码到一个shell文 ...

  2. SPOJ FASTFLOW网络流水题

    Dinic=bfs+dfs  = = 用bfs算出到原点的最短路径(每条残存都算1) 然后每次都跑两端只差1的路径跑dfs,并且一直跑到不能跑 一个优化:如果一个点流出的量已经到流入量了就可以返回上一 ...

  3. 通过监听键盘,实现对UITextView的内容移动

    视图出现时,增加观察 - (void)viewWillAppear:(BOOL)animated { // 增加对键盘的监听 [[NSNotificationCenter defaultCenter] ...

  4. Spring的通知(Advice)

    Spring提供了5种Advice类型: Interception Around:JointPoint前后调用 Before:JointPoint前调用 After Returning:JointPo ...

  5. iOS 让按钮上的标题换行显示

    项目中遇到了要让按钮上的文字换行显示的需求,就写了这个博客. 1.如果按钮上的文字固定,形式是写死的,可以考虑给标题文字加\n换行符来达到效果,但是,记得一定要设置这个属性,不然是不会换行的, but ...

  6. HDU--跑道相遇

    跑道相遇 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  7. Python之路Day20-Django一对一(多)以及Ajax

    上节内容回顾 问题一:Django请求生命周期 -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串-> URL对应关系(匹配) -> 视图函数 -> ...

  8. spring hibernate4 c3p0连接池配置

    c3p0-0.9.1.2.jar,c3p0-oracle-thin-extras-0.9.1.2.jar,点此下载 <bean id="dataSource" class=& ...

  9. Server.Transfer 和 Response.Redirect 用法区别

    在ASP.NET中,在后台传值方式目前大多都是用 Response.Redirect("页面地址") 来重定向页面的,但是现在还有一种方式也可以达到重定向页面的作用,而且在某些时刻 ...

  10. 如何让PowerShell显示中文不乱码

    故障描述: 这两天有个部门做了个Survey用来调查一些信息,由于对最后的结果报表有些特殊要求,不得不决定弃用SharePoint Survey自带的Export to spreadsheet功能,改 ...