1. 程式人生 > >SQLServer之建立非聚集索引

SQLServer之建立非聚集索引

開始之前

典型實現

可以通過下列方法實現非聚集索引:

UNIQUE 約束

在建立 UNIQUE 約束時,預設情況下將建立唯一非聚集索引,以便強制 UNIQUE 約束。 如果不存在該表的聚集索引,則可以指定唯一聚集索引。 有關詳細資訊,請參閱 Unique Constraints and Check Constraints。

獨立於約束的索引

預設情況下,如果未指定聚集,將建立非聚集索引。 對於每個表可建立的最大非聚集索引數為 999。 這包括使用 PRIMARY KEY 或 UNIQUE 約束建立的任何索引,但不包括 XML 索引。

索引檢視的非聚集索引

對檢視建立唯一的聚集索引後,便可以建立非聚集索引。 有關詳細資訊,請參閱 建立索引檢視。

使用SSMS資料庫管理工具建立非聚集索引

使用表設計器建立非聚集索引

1、連線資料庫,選擇資料庫,選擇資料表-》右鍵點選-》選擇設計。

clipboard.png

2、在表設計器視窗-》選擇要新增索引的資料列-》右鍵點選-》選擇索引/鍵。

clipboard.png

3、在索引/鍵彈出框-》點選新增,新增索引-》在常規視窗型別選擇索引-》點選列選擇索引列。

clipboard.png

4、在索引列彈出框-》選擇索引資料列-》選擇索引排序方式-》可以選擇把索引建在多個數據列上-》點選確定。

clipboard.png

5、在索引/鍵彈出框-》輸入索引名稱-》輸入索引描述-》選擇建立非聚集索引-》其它可以選擇自己預設,也可以根據實際情況自己設定-》點選關閉。

clipboard.png

6、點選儲存按鈕(或者按下ctrl+s)-》關閉表設計器-》重新整理表檢視結果。

clipboard.png

使用物件資源管理器建立非聚集索引

1、連線資料庫,選擇資料庫,選擇資料表-》展開資料表-》右鍵點選索引-》選擇新建索引-》選擇非聚集索引。

![圖片上傳中...]

2、在新建索引彈出框-》輸入索引名稱-》選擇是否建立為唯一非聚集索引-》點選新增,新增索引資料列。

clipboard.png

3、在資料表彈出框中-》選擇需要建立索引的資料列,可以選擇多個-》點選確定。

clipboard.png

4、在新建索引彈出框-》點選選項-》可自行設定索引屬性。

clipboard.png

5、在新建索引彈出框-》點選儲存-》選擇索引儲存位置和分割槽方法。

clipboard.png

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

clipboard.png

7、在新建索引彈出框-》點選擴充套件屬性-》輸入屬性名稱-》輸入屬性值-》點選確定。

clipboard.png

8、不需要重新整理可直接檢視結果。

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]) --索引新增在哪個資料列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 不能設定為 ONignore_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'test1',N'index',N'索引名稱';go

示例:

--宣告資料庫引用use testss;go

--判斷是否存在非聚集索引if exists(select * from sys.indexes where name='nonclus1')drop index nonclus1 on test1 with(online=off);go

--新增非聚集索引create

--[unique] --指定聚集索引是否唯一 nonclustered --指定為非聚集索引index nonclus1 --索引名稱on test1 --指定為哪個表建立索引(name asc) --指定索引建在哪個資料列上where name is not 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=on,

--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 不能設定為 ONignore_dup_key=off,

--drop_existing:表示如果這個索引還在表上就 drop 掉然後在 create 一個新的。 預設為 OFF。--drop_existing=on:指定要刪除並重新生成現有索引,其必須具有相同名稱作為引數 index_name。--drop_existing=off:指定不刪除和重新生成現有的索引。 如果指定的索引名稱已經存在,SQL Server 將顯示一個錯誤。--如果刪除開關為on,不存在索引,會報7999訊息錯誤,把開關設定為off即可解決。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,

--aloow_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'nonclus1';go

clipboard.png

建立非聚集索引優缺點

優點:

1、可以對錶或索引檢視建立多個非聚集索引, 對於每個表可建立的最大非聚集索引數為999。

2、非聚集索引通常可幫助您通過比搜尋基礎表更快的速度查詢資料;有時可以完全由非聚集索引中的資料回答查詢,或非聚集索引可將資料庫引擎指向基礎表中的行。

3、建立非聚集索引是為了提高聚集索引不涵蓋的頻繁使用的查詢的效能,或在沒有聚集索引的表(稱為堆)中查詢行。

4、非聚集索引比聚集索引層次多,新增記錄不會引起資料順序的重組。

5、基礎表的資料行不按非聚集鍵的順序排序和儲存。

缺點:

1、查詢速度沒有聚集索引查詢速度快。

2、索引需要佔物理空間。