日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2023/12/9 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

在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) - 非聚集索引分区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。