SQLServer之建立惟一非彙集索引

建立惟一非彙集索引典型實現

惟一索引可經過如下方式實現:數據庫

PRIMARY KEY 或 UNIQUE 約束express

在建立 PRIMARY KEY 約束時,若是不存在該表的彙集索引且未指定惟一非彙集索引,則將自動對一列或多列建立惟一彙集索引。 主鍵列不容許空值。服務器

在建立 UNIQUE 約束時,默認狀況下將建立惟一非彙集索引,以便強制 UNIQUE 約束。 若是不存在該表的彙集索引,則能夠指定惟一彙集索引。架構

有關詳細信息,請參閱 Unique Constraints and Check Constraints 和 Primary and Foreign Key Constraints。工具

獨立於約束的索引性能

能夠爲一個表定義多個惟一非彙集索引。優化

有關詳細信息,請參閱 CREATE INDEX (Transact-SQL)。spa

索引視圖設計

若要建立索引視圖,請對一個或多個視圖列定義惟一彙集索引。 視圖將執行,而且結果集存儲在該索引的頁級別中,其存儲方式與表數據存儲在彙集索引中的方式相同。 有關詳細信息,請參閱 建立索引視圖。對象

建立惟一非彙集索引限制和侷限

若是數據中存在重複的鍵值,則不能建立惟一索引、UNIQUE 約束或 PRIMARY KEY 約束。

惟一非彙集索引能夠包括包含性非鍵列。 有關詳細信息,請參閱 Create Indexes with Included Columns。

使用SSMS數據庫管理工具建立惟一非彙集索引

使用表設計器建立惟一非彙集索引

一、鏈接數據庫,選擇數據庫,選擇數據表-》右鍵點擊-》選擇設計。

clipboard.png

二、在表設計器窗口-》選擇要添加索引的屬性列-》右鍵點擊-》選擇索引/鍵。

clipboard.png

三、在索引/鍵彈出框-》點擊添加,添加索引-》在常規窗口類型選擇索引-》點擊列選擇數據列。

clipboard.png

四、在索引列彈出框-》點擊添加索引列-》點擊選擇索引列排序規則-》能夠把一個索引創建在多個數據列上-》點擊肯定。

clipboard.png

五、在索引/鍵彈出框-》選擇建立惟一索引-》輸入索引名稱-》輸入索引描述-》選擇建立爲非彙集索引-》其它能夠選擇默認-》點擊關閉。

clipboard.png

六、點擊保存(或者ctrl+s)-》關閉表設計器-》刷新表-》查看結果。

clipboard.png

使用對象資源管理器建立惟一索引

一、鏈接數據庫,選擇數據庫,選擇數據表-》展開對象資源管理器-》右鍵點擊索引-》選擇新建索引-》選擇非彙集索引。

clipboard.png

二、在新建索引彈出框-》輸入索引名稱-》選擇建立爲惟一索引-》點擊添加,選擇索引數據列。

clipboard.png

三、在數據表列-》選擇索引要添加的數據列,能夠選擇多個-》點擊肯定。

clipboard.png

四、在新建索引窗口-》點擊包含性列-》點擊添加。

clipboard.png

五、在數據表列-》點擊選擇包含性列,能夠選擇多個-》點擊肯定。

clipboard.png

六、在新建索引窗口-》點擊選項-》能夠本身設置索引屬性。

clipboard.png

七、在新建索引彈出框-》點擊存儲-》設置索引和數據存儲規則。

clipboard.png

八、在新建索引彈出框-》點擊篩選器-》輸入篩選規則。

clipboard.png

九、在新建索引彈出框-》點擊擴展屬性-》輸入擴展屬性名稱-》輸入擴展屬性名稱-》能夠輸入多個擴展屬性-》點擊肯定。

clipboard.png

十、查看建立結果。

clipboard.png

使用T-SQL腳本建立惟一非彙集索引

語法:

--聲明數據庫引用
use 數據庫名;
go

--判斷索引是否存在
if exists(select * from sysindexes where name=索引名)
drop index 索引名 on 表名 with (online=off);
go

--添加索引
create
--[unique] --指定彙集索引是否惟一
[clustered | nonclustered] --指定爲彙集索引
index 索引名稱 --索引名稱
on 表名 --索引添加在哪一個表
(列名 [asc | desc],列名 [asc | desc],...) --索引添加在哪一個數據列

--能夠經過將非鍵列添加到非彙集索引的葉級別來擴展非彙集索引的功能。經過包含非鍵列,能夠建立覆蓋更多查詢的非彙集索引。這是由於非鍵列具備下列優勢:

--一、它們能夠是不容許做爲索引鍵列的數據類型。
--二、在計算索引鍵列數或索引鍵大小時,數據庫引擎不考慮它們。
--當查詢中的全部列都做爲鍵列或非鍵列包含在索引中時,帶有包含性非鍵列的索引能夠顯著提升查詢性能。
--這樣能夠實現性能提高,由於查詢優化器能夠在索引中找到全部列值;不訪問表或彙集索引數據,從而減小磁盤 I/O 操做。
include(列名,......)

where (篩選表達式) --篩選表達式

with(

--pad_index:指定索引填充
--pad_index=on:FILLFACTOR 指定的可用空間百分比應用於索引的中間級頁。
--pad_index=off或未指定 fillfactor:考慮到中間級頁上的鍵集,能夠將中間級頁幾乎填滿,但至少要爲最大索引行留出足夠空間。
pad_index={ on | off },

--statistics_norecompute:指定是否從新計算統計信息。
--statistics_norecompute=on:過期的統計信息不會自動從新計算。
--statistics_norecompute=off:啓用自動統計信息更新。
statistics_norecompute={ on | off },

--sort_in_tempdb:指定是否將排序結果存儲在 tempdb 中。
--sort_in_tempdb=on:在tempdb中存儲用於生成索引的中間排序結果。若是tempdb與用戶數據庫不在同一組磁盤上,就可縮短建立索引所需的時間。可是,這會增長索引生成期間所使用的磁盤空間量。
--sort_in_tempdb=off:中間排序結果與索引存儲在同一數據庫中。
sort_in_tempdb={ on | off },

--ignore_dup_key:指定在插入操做嘗試向惟一索引插入重複鍵值時的響應類型。 IGNORE_DUP_KEY 選項僅適用於建立或從新生成索引後發生的插入操做。 當執行 CREATE INDEX、ALTER INDEX 或 UPDATE 時,該選項無效。 默認爲 OFF。
--ignore_dup_key=on:打開,將重複鍵值插入惟一索引時會出現警告消息。只有違反惟一性的行爲纔會失敗。
--ignore_dup_key=off:關閉,將重複鍵值插入惟一索引時會出現錯誤消息。回滾整個INSERT操做。對於對視圖建立的索引、非惟一索引、XML 索引、空間索引以及篩選的索引,IGNORE_DUP_KEY 不能設置爲 ON
ignore_dup_key={ on | off },

--drop_existing:表示若是這個索引還在表上就 drop 掉而後在 create 一個新的。 默認爲 OFF。
--drop_existing=on:指定要刪除並從新生成現有索引,其必須具備相同名稱做爲參數 index_name。
--drop_existing=off:指定不刪除和從新生成現有的索引。 若是指定的索引名稱已經存在,SQL Server 將顯示一個錯誤。
drop_existing={ on | off },

--online:指定在索引操做期間基礎表和關聯的索引是否可用於查詢和數據修改操做。 默認爲 OFF。 REBUILD 可做爲 ONLINE 操做執行。
--online=on:在索引操做期間不持有長期表鎖。 在索引操做的主要階段,源表上只使用意向共享 (IS) 鎖。
--這使得可以繼續對基礎表和索引進行查詢或更新。
--操做開始時,在很短的時間內對源對象持有共享 (S) 鎖。
--操做結束時,若是建立非彙集索引,將在短時間內獲取對源的 S(共享)鎖;
--當聯機建立或刪除彙集索引時,以及從新生成彙集或非彙集索引時,將在短時間內獲取 SCH-M(架構修改)鎖。 但聯機索引鎖是短的元數據鎖,特別是 Sch-M 鎖必須等待此表上的全部阻塞事務完成。
--在等待期間,Sch-M 鎖在訪問同一表時阻止在此鎖後等待的全部其餘事務。 對本地臨時表建立索引時,ONLINE 不能設置爲 ON。
--online=off:在索引操做期間應用表鎖。這樣能夠防止全部用戶在操做期間訪問基礎表。
--建立、從新生成或刪除彙集索引或者從新生成或刪除非彙集索引的脫機索引操做將對錶獲取架構修改 (Sch-M) 鎖。
--這樣能夠防止全部用戶在操做期間訪問基礎表。 建立非彙集索引的脫機索引操做將對錶獲取共享 (S) 鎖。 這樣能夠防止更新基礎表,但容許讀操做(如 SELECT 語句)。
online={ on | off },

--aloow_row_locks:指定是否容許行鎖。
--allow_row_locks=on:訪問索引時容許行鎖。數據庫引擎肯定什麼時候使用行鎖。
--allow_row_locks=off:不使用行鎖。
allow_row_locks={ on | off },

--allow_page_locks:指定是否容許使用頁鎖。
--allow_page_locks=on:訪問索引時容許頁鎖。數據庫引擎肯定什麼時候使用頁鎖。
-- allow_page_locks=off:不使用頁鎖。
allow_page_locks={ on | off },

--fillfactor=n:指定一個百分比,指示在數據庫引擎建立或修改索引的過程當中,應將每一個索引頁面的葉級填充到什麼程度。 指定的值必須是 1 到 100 之間的整數。 默認值爲 0。
fillfactor=n

--maxdop=max_degree_of_parallelism:在索引操做期間替代 max degree of parallelism 配置選項。 有關詳細信息,請參閱 配置 max degree of parallelism 服務器配置選項。 使用 MAXDOP 能夠限制在執行並行計劃的過程當中使用的處理器數量。 最大數量爲 64 個處理器。
--max_degree_of_parallelism 能夠是:
--1 - 取消生成並行計劃。
-->1 - 將並行索引操做中使用的最大處理器數量限制爲指定數量。
--0(默認值)- 根據當前系統工做負荷使用實際數量的處理器或更少數量的處理器。
--有關詳細信息,請參閱 配置並行索引操做。
--maxdop=max_degree_of_parallelism,

--data_compression=row:爲指定的表、分區號或分區範圍指定數據壓縮選項。 選項以下所示:
--none
--不壓縮表或指定的分區。 僅適用於行存儲表;不適用於列存儲表。
--row
--使用行壓縮來壓縮表或指定的分區。 僅適用於行存儲表;不適用於列存儲表。
--page
--使用頁壓縮來壓縮表或指定的分區。 僅適用於行存儲表;不適用於列存儲表。
--columnstore
--適用範圍: SQL Server 2014 (12.x) 到 SQL Server 2017。
--僅適用於列存儲表。 COLUMNSTORE 指定對使用 COLUMNSTORE_ARCHIVE 選項壓縮的分區進行解壓縮。 還原數據時,將繼續經過用於全部列存儲表的列存儲壓縮對 COLUMNSTORE 索引進行壓縮。
--columnstore_archive
--適用範圍: SQL Server 2014 (12.x) 到 SQL Server 2017。
--僅適用於列存儲表,這是使用匯集列存儲索引存儲的表。 COLUMNSTORE_ARCHIVE 會進一步將指定分區壓縮到更小。 這可用於存檔,或者用於要求更少存儲而且能夠付出更多時間來進行存儲和檢索的其餘情形
--data_compression={ none | row | page | columnstore | columnstore_archive }

--on partitions ( { <partition_number_expression> | <range> } [ ,...n ] ) 適用範圍: SQL Server 2008 到 SQL Server 2017。
--指定對其應用 DATA_COMPRESSION 設置的分區。 若是表未分區,ON PARTITIONS 參數將生成錯誤。 若是不提供 ON PARTITIONS 子句,DATA_COMPRESSION 選項將應用於已分區表的全部分區。
--能夠按如下方式指定 <partition_number_expression>:
--提供一個分區號,例如:ON PARTITIONS (2)。
--提供若干單獨分區的分區號並用逗號將它們隔開,例如:ON PARTITIONS (1, 5)。
--同時提供範圍和單個分區,例如:ON PARTITIONS (2, 4, 6 TO 8)。
--<range> 能夠指定爲以單詞 TO 隔開的分區號,例如:ON PARTITIONS (6 TO 8)。
--,請屢次指定 DATA_COMPRESSION 選項
--on partitions(1-2)

)
on [primary];--數據空間規範
go

--添加註釋
execute sp_addextendedproperty N'MS_Description',N'索引說明',N'schema',N'dbo',N'table',N'表名',N'index',N'索引名稱';
go

示例:

--聲明數據庫應用
use testss;
go

--判斷是否存在索引
if exists(select * from sysindexes where name='uniquenonclus1')
drop index uniquenonclus1 on test1 with(online=off);
go

create
unique --惟一
nonclustered --非彙集索引
index --索引關鍵字
uniquenonclus1 --索引名稱
on test1 --索引創建在哪張表
(name asc) --索引創建在哪一個數據列
--能夠經過將非鍵列添加到非彙集索引的葉級別來擴展非彙集索引的功能。經過包含非鍵列,能夠建立覆蓋更多查詢的非彙集索引。這是由於非鍵列具備下列優勢:
--一、它們能夠是不容許做爲索引鍵列的數據類型。
--二、在計算索引鍵列數或索引鍵大小時,數據庫引擎不考慮它們。
--當查詢中的全部列都做爲鍵列或非鍵列包含在索引中時,帶有包含性非鍵列的索引能夠顯著提升查詢性能。
--這樣能夠實現性能提高,由於查詢優化器能夠在索引中找到全部列值;不訪問表或彙集索引數據,從而減小磁盤 I/O 操做。
include(sex)
where (name is null) --篩選表達式
with(

--pad_index:指定索引填充
--pad_index=on:FILLFACTOR 指定的可用空間百分比應用於索引的中間級頁。
--pad_index=off或未指定 fillfactor:考慮到中間級頁上的鍵集,能夠將中間級頁幾乎填滿,但至少要爲最大索引行留出足夠空間。
pad_index=on,

--statistics_norecompute:指定是否從新計算統計信息。
--statistics_norecompute=on:過期的統計信息不會自動從新計算。
--statistics_norecompute=off:啓用自動統計信息更新。
statistics_norecompute=on,

--sort_in_tempdb:指定是否將排序結果存儲在 tempdb 中。
--sort_in_tempdb=on:在tempdb中存儲用於生成索引的中間排序結果。若是tempdb與用戶數據庫不在同一組磁盤上,就可縮短建立索引所需的時間。可是,這會增長索引生成期間所使用的磁盤空間量。
--sort_in_tempdb=off:中間排序結果與索引存儲在同一數據庫中。
sort_in_tempdb=off,

--ignore_dup_key:指定在插入操做嘗試向惟一索引插入重複鍵值時的響應類型。 IGNORE_DUP_KEY 選項僅適用於建立或從新生成索引後發生的插入操做。 當執行 CREATE INDEX、ALTER INDEX 或 UPDATE 時,該選項無效。 默認爲 OFF。
--ignore_dup_key=on:打開,將重複鍵值插入惟一索引時會出現警告消息。只有違反惟一性的行爲纔會失敗。
--ignore_dup_key=off:關閉,將重複鍵值插入惟一索引時會出現錯誤消息。回滾整個INSERT操做。對於對視圖建立的索引、非惟一索引、XML 索引、空間索引以及篩選的索引,IGNORE_DUP_KEY 不能設置爲 ON
ignore_dup_key=off,

--drop_existing:表示若是這個索引還在表上就 drop 掉而後在 create 一個新的。 默認爲 OFF。
--drop_existing=on:指定要刪除並從新生成現有索引,其必須具備相同名稱做爲參數 index_name。
--drop_existing=off:指定不刪除和從新生成現有的索引。 若是指定的索引名稱已經存在,SQL Server 將顯示一個錯誤。
drop_existing=off,

--online:指定在索引操做期間基礎表和關聯的索引是否可用於查詢和數據修改操做。 默認爲 OFF。 REBUILD 可做爲 ONLINE 操做執行。
--online=on:在索引操做期間不持有長期表鎖。 在索引操做的主要階段,源表上只使用意向共享 (IS) 鎖。
--這使得可以繼續對基礎表和索引進行查詢或更新。
--操做開始時,在很短的時間內對源對象持有共享 (S) 鎖。
--操做結束時,若是建立非彙集索引,將在短時間內獲取對源的 S(共享)鎖;
--當聯機建立或刪除彙集索引時,以及從新生成彙集或非彙集索引時,將在短時間內獲取 SCH-M(架構修改)鎖。 但聯機索引鎖是短的元數據鎖,特別是 Sch-M 鎖必須等待此表上的全部阻塞事務完成。
--在等待期間,Sch-M 鎖在訪問同一表時阻止在此鎖後等待的全部其餘事務。 對本地臨時表建立索引時,ONLINE 不能設置爲 ON。
--online=off:在索引操做期間應用表鎖。這樣能夠防止全部用戶在操做期間訪問基礎表。
--建立、從新生成或刪除彙集索引或者從新生成或刪除非彙集索引的脫機索引操做將對錶獲取架構修改 (Sch-M) 鎖。
--這樣能夠防止全部用戶在操做期間訪問基礎表。 建立非彙集索引的脫機索引操做將對錶獲取共享 (S) 鎖。 這樣能夠防止更新基礎表,但容許讀操做(如 SELECT 語句)。
online=off,

--allow_row_locks:指定是否容許行鎖。
--allow_row_locks=on:訪問索引時容許行鎖。數據庫引擎肯定什麼時候使用行鎖。
--allow_row_locks=off:不使用行鎖。
allow_row_locks=on,

--allow_page_locks:指定是否容許使用頁鎖。
--allow_page_locks=on:訪問索引時容許頁鎖。數據庫引擎肯定什麼時候使用頁鎖。
--allow_page_locks=off:不使用頁鎖。
allow_page_locks=on,

--fillfactor=n:指定一個百分比,指示在數據庫引擎建立或修改索引的過程當中,應將每一個索引頁面的葉級填充到什麼程度。 指定的值必須是 1 到 100 之間的整數。 默認值爲 0。
fillfactor=1,

--maxdop=max_degree_of_parallelism:在索引操做期間替代 max degree of parallelism 配置選項。 有關詳細信息,請參閱 配置 max degree of parallelism 服務器配置選項。 使用 MAXDOP 能夠限制在執行並行計劃的過程當中使用的處理器數量。 最大數量爲 64 個處理器。
--max_degree_of_parallelism 能夠是:
--1 - 取消生成並行計劃。
-->1 - 將並行索引操做中使用的最大處理器數量限制爲指定數量。
--0(默認值)- 根據當前系統工做負荷使用實際數量的處理器或更少數量的處理器。
--有關詳細信息,請參閱 配置並行索引操做。
maxdop=1

--data_compression=row:爲指定的表、分區號或分區範圍指定數據壓縮選項。 選項以下所示:
--none
--不壓縮表或指定的分區。 僅適用於行存儲表;不適用於列存儲表。
--row
--使用行壓縮來壓縮表或指定的分區。 僅適用於行存儲表;不適用於列存儲表。
--page
--使用頁壓縮來壓縮表或指定的分區。 僅適用於行存儲表;不適用於列存儲表。
--columnstore
--適用範圍: SQL Server 2014 (12.x) 到 SQL Server 2017。
--僅適用於列存儲表。 COLUMNSTORE 指定對使用 COLUMNSTORE_ARCHIVE 選項壓縮的分區進行解壓縮。 還原數據時,將繼續經過用於全部列存儲表的列存儲壓縮對 COLUMNSTORE 索引進行壓縮。
--columnstore_archive
--適用範圍: SQL Server 2014 (12.x) 到 SQL Server 2017。
--僅適用於列存儲表,這是使用匯集列存儲索引存儲的表。 COLUMNSTORE_ARCHIVE 會進一步將指定分區壓縮到更小。 這可用於存檔,或者用於要求更少存儲而且能夠付出更多時間來進行存儲和檢索的其餘情形
--data_compression=none

--on partitions ( { <partition_number_expression> | <range> } [ ,...n ] ) 適用範圍: SQL Server 2008 到 SQL Server 2017。
--指定對其應用 DATA_COMPRESSION 設置的分區。 若是表未分區,ON PARTITIONS 參數將生成錯誤。 若是不提供 ON PARTITIONS 子句,DATA_COMPRESSION 選項將應用於已分區表的全部分區。
--能夠按如下方式指定 <partition_number_expression>:
--提供一個分區號,例如:ON PARTITIONS (2)。
--提供若干單獨分區的分區號並用逗號將它們隔開,例如:ON PARTITIONS (1, 5)。
--同時提供範圍和單個分區,例如:ON PARTITIONS (2, 4, 6 TO 8)。
--<range> 能夠指定爲以單詞 TO 隔開的分區號,例如:ON PARTITIONS (6 TO 8)。
--,請屢次指定 DATA_COMPRESSION 選項
--on partitions(1-2)
)
on [primary];
go

--添加惟一彙集索引描述
execute sp_addextendedproperty N'MS_Description',N'第一個惟一彙集索引',N'schema',N'dbo',N'table',N'test1',N'index',N'uniquenonclus1';
go

clipboard.png

建立惟一非彙集索引優缺點

優勢:

一、只要每一個列中的數據是惟一的,就能夠爲同一個表建立多個惟一非彙集索引。

二、惟一索引提供幫助查詢優化器生成更高效的執行計劃的其餘信息。

三、惟一索引可以確保定義的列的數據完整性。

四、多列惟一索引可以保證索引鍵中值的每一個組合都是惟一的。

五、能夠加速表和表之間的鏈接,特別是在實現數據的參考完整性方面特別有意義。

六、在使用分組和排序子句進行數據檢索時,一樣能夠顯著減小查詢中分組和排序的時間。

缺點:

一、建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長。

二、索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間。

三、當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,下降了數據的維護速度。

相關文章
相關標籤/搜索