SQLServer之创建非聚集索引
開始之前
典型實(shí)現(xiàn)
可以通過下列方法實(shí)現(xiàn)非聚集索引:
UNIQUE 約束
在創(chuàng)建 UNIQUE 約束時,默認(rèn)情況下將創(chuàng)建唯一非聚集索引,以便強(qiáng)制 UNIQUE 約束。 如果不存在該表的聚集索引,則可以指定唯一聚集索引。 有關(guān)詳細(xì)信息,請參閱 Unique Constraints and Check Constraints。
獨(dú)立于約束的索引
默認(rèn)情況下,如果未指定聚集,將創(chuàng)建非聚集索引。 對于每個表可創(chuàng)建的最大非聚集索引數(shù)為 999。 這包括使用 PRIMARY KEY 或 UNIQUE 約束創(chuàng)建的任何索引,但不包括 XML 索引。
索引視圖的非聚集索引
對視圖創(chuàng)建唯一的聚集索引后,便可以創(chuàng)建非聚集索引。 有關(guān)詳細(xì)信息,請參閱 創(chuàng)建索引視圖。
使用SSMS數(shù)據(jù)庫管理工具創(chuàng)建非聚集索引
使用表設(shè)計器創(chuàng)建非聚集索引
1、連接數(shù)據(jù)庫,選擇數(shù)據(jù)庫,選擇數(shù)據(jù)表-》右鍵點(diǎn)擊-》選擇設(shè)計。
2、在表設(shè)計器窗口-》選擇要添加索引的數(shù)據(jù)列-》右鍵點(diǎn)擊-》選擇索引/鍵。
3、在索引/鍵彈出框-》點(diǎn)擊添加,添加索引-》在常規(guī)窗口類型選擇索引-》點(diǎn)擊列選擇索引列。
4、在索引列彈出框-》選擇索引數(shù)據(jù)列-》選擇索引排序方式-》可以選擇把索引建在多個數(shù)據(jù)列上-》點(diǎn)擊確定。
5、在索引/鍵彈出框-》輸入索引名稱-》輸入索引描述-》選擇創(chuàng)建非聚集索引-》其它可以選擇自己默認(rèn),也可以根據(jù)實(shí)際情況自己設(shè)置-》點(diǎn)擊關(guān)閉。
6、點(diǎn)擊保存按鈕(或者按下ctrl+s)-》關(guān)閉表設(shè)計器-》刷新表查看結(jié)果。
使用對象資源管理器創(chuàng)建非聚集索引
1、連接數(shù)據(jù)庫,選擇數(shù)據(jù)庫,選擇數(shù)據(jù)表-》展開數(shù)據(jù)表-》右鍵點(diǎn)擊索引-》選擇新建索引-》選擇非聚集索引。
![圖片上傳中...]
2、在新建索引彈出框-》輸入索引名稱-》選擇是否創(chuàng)建為唯一非聚集索引-》點(diǎn)擊添加,添加索引數(shù)據(jù)列。
3、在數(shù)據(jù)表彈出框中-》選擇需要創(chuàng)建索引的數(shù)據(jù)列,可以選擇多個-》點(diǎn)擊確定。
4、在新建索引彈出框-》點(diǎn)擊選項(xiàng)-》可自行設(shè)置索引屬性。
5、在新建索引彈出框-》點(diǎn)擊儲存-》選擇索引存儲位置和分區(qū)方法。
6、在新建索引彈出框-》點(diǎn)擊篩選器-》輸入篩選規(guī)則。
7、在新建索引彈出框-》點(diǎn)擊擴(kuò)展屬性-》輸入屬性名稱-》輸入屬性值-》點(diǎn)擊確定。
8、不需要刷新可直接查看結(jié)果。
使用T-SQL腳本創(chuàng)建非聚集索引
語法:
--聲明數(shù)據(jù)庫引用
use 數(shù)據(jù)庫名;
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]) --索引添加在哪個數(shù)據(jù)列
with(
--pad_index:指定索引填充
--pad_index=on:FILLFACTOR 指定的可用空間百分比應(yīng)用于索引的中間級頁。
--pad_index=off或未指定 fillfactor:考慮到中間級頁上的鍵集,可以將中間級頁幾乎填滿,但至少要為最大索引行留出足夠空間。
pad_index={ on | off },
--statistics_norecompute:指定是否重新計算統(tǒng)計信息。
--statistics_norecompute=on:過時的統(tǒng)計信息不會自動重新計算。
--statistics_norecompute=off:啟用自動統(tǒng)計信息更新。
statistics_norecompute={ on | off },
--sort_in_tempdb:指定是否將排序結(jié)果存儲在 tempdb 中。
--sort_in_tempdb=on:在tempdb中存儲用于生成索引的中間排序結(jié)果。如果tempdb與用戶數(shù)據(jù)庫不在同一組磁盤上,就可縮短創(chuàng)建索引所需的時間。但是,這會增加索引生成期間所使用的磁盤空間量。
--sort_in_tempdb=off:中間排序結(jié)果與索引存儲在同一數(shù)據(jù)庫中。
sort_in_tempdb={ on | off },
--ignore_dup_key:指定在插入操作嘗試向唯一索引插入重復(fù)鍵值時的響應(yīng)類型。 IGNORE_DUP_KEY 選項(xiàng)僅適用于創(chuàng)建或重新生成索引后發(fā)生的插入操作。 當(dāng)執(zhí)行 CREATE INDEX、ALTER INDEX 或 UPDATE 時,該選項(xiàng)無效。 默認(rèn)為 OFF。
--ignore_dup_key=on:打開,將重復(fù)鍵值插入唯一索引時會出現(xiàn)警告消息。只有違反唯一性的行為才會失敗。
--ignore_dup_key=off:關(guān)閉,將重復(fù)鍵值插入唯一索引時會出現(xiàn)錯誤消息。回滾整個INSERT操作。對于對視圖創(chuàng)建的索引、非唯一索引、XML 索引、空間索引以及篩選的索引,IGNORE_DUP_KEY 不能設(shè)置為 ON
ignore_dup_key={ on | off },
--drop_existing:表示如果這個索引還在表上就 drop 掉然后在 create 一個新的。 默認(rèn)為 OFF。
--drop_existing=on:指定要刪除并重新生成現(xiàn)有索引,其必須具有相同名稱作為參數(shù) index_name。
--drop_existing=off:指定不刪除和重新生成現(xiàn)有的索引。 如果指定的索引名稱已經(jīng)存在,SQL Server 將顯示一個錯誤。
drop_existing={ on | off },
--online:指定在索引操作期間基礎(chǔ)表和關(guān)聯(lián)的索引是否可用于查詢和數(shù)據(jù)修改操作。 默認(rèn)為 OFF。 REBUILD 可作為 ONLINE 操作執(zhí)行。
--online=on:在索引操作期間不持有長期表鎖。 在索引操作的主要階段,源表上只使用意向共享 (IS) 鎖。
--這使得能夠繼續(xù)對基礎(chǔ)表和索引進(jìn)行查詢或更新。
--操作開始時,在很短的時間內(nèi)對源對象持有共享 (S) 鎖。
--操作結(jié)束時,如果創(chuàng)建非聚集索引,將在短期內(nèi)獲取對源的 S(共享)鎖;
--當(dāng)聯(lián)機(jī)創(chuàng)建或刪除聚集索引時,以及重新生成聚集或非聚集索引時,將在短期內(nèi)獲取 SCH-M(架構(gòu)修改)鎖。 但聯(lián)機(jī)索引鎖是短的元數(shù)據(jù)鎖,特別是 Sch-M 鎖必須等待此表上的所有阻塞事務(wù)完成。
--在等待期間,Sch-M 鎖在訪問同一表時阻止在此鎖后等待的所有其他事務(wù)。 對本地臨時表創(chuàng)建索引時,ONLINE 不能設(shè)置為 ON。
--online=off:在索引操作期間應(yīng)用表鎖。這樣可以防止所有用戶在操作期間訪問基礎(chǔ)表。
--創(chuàng)建、重新生成或刪除聚集索引或者重新生成或刪除非聚集索引的脫機(jī)索引操作將對表獲取架構(gòu)修改 (Sch-M) 鎖。
--這樣可以防止所有用戶在操作期間訪問基礎(chǔ)表。 創(chuàng)建非聚集索引的脫機(jī)索引操作將對表獲取共享 (S) 鎖。 這樣可以防止更新基礎(chǔ)表,但允許讀操作(如 SELECT 語句)。
online={ on | off },
--aloow_row_locks:指定是否允許行鎖。
--allow_row_locks=on:訪問索引時允許行鎖。數(shù)據(jù)庫引擎確定何時使用行鎖。
--allow_row_locks=off:不使用行鎖。
allow_row_locks={ on | off },
--allow_page_locks:指定是否允許使用頁鎖。
--allow_page_locks=on:訪問索引時允許頁鎖。數(shù)據(jù)庫引擎確定何時使用頁鎖。
-- allow_page_locks=off:不使用頁鎖。
allow_page_locks={ on | off },
--fillfactor=n:指定一個百分比,指示在數(shù)據(jù)庫引擎創(chuàng)建或修改索引的過程中,應(yīng)將每個索引頁面的葉級填充到什么程度。 指定的值必須是 1 到 100 之間的整數(shù)。 默認(rèn)值為 0。
fillfactor=n
--maxdop=max_degree_of_parallelism:在索引操作期間替代 max degree of parallelism 配置選項(xiàng)。 有關(guān)詳細(xì)信息,請參閱 配置 max degree of parallelism 服務(wù)器配置選項(xiàng)。 使用 MAXDOP 可以限制在執(zhí)行并行計劃的過程中使用的處理器數(shù)量。 最大數(shù)量為 64 個處理器。
--max_degree_of_parallelism 可以是:
--1 - 取消生成并行計劃。
-->1 - 將并行索引操作中使用的最大處理器數(shù)量限制為指定數(shù)量。
--0(默認(rèn)值)- 根據(jù)當(dāng)前系統(tǒng)工作負(fù)荷使用實(shí)際數(shù)量的處理器或更少數(shù)量的處理器。
--有關(guān)詳細(xì)信息,請參閱 配置并行索引操作。
--maxdop=max_degree_of_parallelism,
--data_compression=row:為指定的表、分區(qū)號或分區(qū)范圍指定數(shù)據(jù)壓縮選項(xiàng)。 選項(xiàng)如下所示:
--none
--不壓縮表或指定的分區(qū)。 僅適用于行存儲表;不適用于列存儲表。
--row
--使用行壓縮來壓縮表或指定的分區(qū)。 僅適用于行存儲表;不適用于列存儲表。
--page
--使用頁壓縮來壓縮表或指定的分區(qū)。 僅適用于行存儲表;不適用于列存儲表。
--columnstore
--適用范圍: SQL Server 2014 (12.x) 到 SQL Server 2017。
--僅適用于列存儲表。 COLUMNSTORE 指定對使用 COLUMNSTORE_ARCHIVE 選項(xiàng)壓縮的分區(qū)進(jìn)行解壓縮。 還原數(shù)據(jù)時,將繼續(xù)通過用于所有列存儲表的列存儲壓縮對 COLUMNSTORE 索引進(jìn)行壓縮。
--columnstore_archive
--適用范圍: SQL Server 2014 (12.x) 到 SQL Server 2017。
--僅適用于列存儲表,這是使用聚集列存儲索引存儲的表。 COLUMNSTORE_ARCHIVE 會進(jìn)一步將指定分區(qū)壓縮到更小。 這可用于存檔,或者用于要求更少存儲并且可以付出更多時間來進(jìn)行存儲和檢索的其他情形
--data_compression={ none | row | page | columnstore | columnstore_archive }
--on partitions ( { <partition_number_expression> | <range> } [ ,...n ] ) 適用范圍: SQL Server 2008 到 SQL Server 2017。
--指定對其應(yīng)用 DATA_COMPRESSION 設(shè)置的分區(qū)。 如果表未分區(qū),ON PARTITIONS 參數(shù)將生成錯誤。 如果不提供 ON PARTITIONS 子句,DATA_COMPRESSION 選項(xiàng)將應(yīng)用于已分區(qū)表的所有分區(qū)。
--可以按以下方式指定 <partition_number_expression>:
--提供一個分區(qū)號,例如:ON PARTITIONS (2)。
--提供若干單獨(dú)分區(qū)的分區(qū)號并用逗號將它們隔開,例如:ON PARTITIONS (1, 5)。
--同時提供范圍和單個分區(qū),例如:ON PARTITIONS (2, 4, 6 TO 8)。
--<range> 可以指定為以單詞 TO 隔開的分區(qū)號,例如:ON PARTITIONS (6 TO 8)。
--,請多次指定 DATA_COMPRESSION 選項(xiàng)
--on partitions(1-2)
)
on [primary];--數(shù)據(jù)空間規(guī)范
go
--添加注釋
execute sp_addextendedproperty N'MS_Description',N'索引說明',N'schema',N'dbo',N'table',N'test1',N'index',N'索引名稱';
go
示例:
--聲明數(shù)據(jù)庫引用
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 --指定為哪個表創(chuàng)建索引
(name asc) --指定索引建在哪個數(shù)據(jù)列上
where name is not null --篩選器
with(
--pad_index:指定索引填充
--pad_index=on:FILLFACTOR 指定的可用空間百分比應(yīng)用于索引的中間級頁。
--pad_index=off或未指定 fillfactor:考慮到中間級頁上的鍵集,可以將中間級頁幾乎填滿,但至少要為最大索引行留出足夠空間。
pad_index=on,
--statistics_norecompute:指定是否重新計算統(tǒng)計信息。
--statistics_norecompute=on:過時的統(tǒng)計信息不會自動重新計算。
--statistics_norecompute=off:啟用自動統(tǒng)計信息更新。
statistics_norecompute=on,
--sort_in_tempdb:指定是否將排序結(jié)果存儲在 tempdb 中。
--sort_in_tempdb=on:在tempdb中存儲用于生成索引的中間排序結(jié)果。如果tempdb與用戶數(shù)據(jù)庫不在同一組磁盤上,就可縮短創(chuàng)建索引所需的時間。但是,這會增加索引生成期間所使用的磁盤空間量。
--sort_in_tempdb=off:中間排序結(jié)果與索引存儲在同一數(shù)據(jù)庫中。
sort_in_tempdb=on,
--ignore_dup_key:指定在插入操作嘗試向唯一索引插入重復(fù)鍵值時的響應(yīng)類型。 IGNORE_DUP_KEY 選項(xiàng)僅適用于創(chuàng)建或重新生成索引后發(fā)生的插入操作。 當(dāng)執(zhí)行 CREATE INDEX、ALTER INDEX 或 UPDATE 時,該選項(xiàng)無效。 默認(rèn)為 OFF。
--ignore_dup_key=on:打開,將重復(fù)鍵值插入唯一索引時會出現(xiàn)警告消息。只有違反唯一性的行為才會失敗。
--ignore_dup_key=off:關(guān)閉,將重復(fù)鍵值插入唯一索引時會出現(xiàn)錯誤消息。回滾整個INSERT操作。對于對視圖創(chuàng)建的索引、非唯一索引、XML 索引、空間索引以及篩選的索引,IGNORE_DUP_KEY 不能設(shè)置為 ON
ignore_dup_key=off,
--drop_existing:表示如果這個索引還在表上就 drop 掉然后在 create 一個新的。 默認(rèn)為 OFF。
--drop_existing=on:指定要刪除并重新生成現(xiàn)有索引,其必須具有相同名稱作為參數(shù) index_name。
--drop_existing=off:指定不刪除和重新生成現(xiàn)有的索引。 如果指定的索引名稱已經(jīng)存在,SQL Server 將顯示一個錯誤。
--如果刪除開關(guān)為on,不存在索引,會報7999消息錯誤,把開關(guān)設(shè)置為off即可解決。
drop_existing=off,
--online:指定在索引操作期間基礎(chǔ)表和關(guān)聯(lián)的索引是否可用于查詢和數(shù)據(jù)修改操作。 默認(rèn)為 OFF。 REBUILD 可作為 ONLINE 操作執(zhí)行。
--online=on:在索引操作期間不持有長期表鎖。 在索引操作的主要階段,源表上只使用意向共享 (IS) 鎖。
--這使得能夠繼續(xù)對基礎(chǔ)表和索引進(jìn)行查詢或更新。
--操作開始時,在很短的時間內(nèi)對源對象持有共享 (S) 鎖。
--操作結(jié)束時,如果創(chuàng)建非聚集索引,將在短期內(nèi)獲取對源的 S(共享)鎖;
--當(dāng)聯(lián)機(jī)創(chuàng)建或刪除聚集索引時,以及重新生成聚集或非聚集索引時,將在短期內(nèi)獲取 SCH-M(架構(gòu)修改)鎖。 但聯(lián)機(jī)索引鎖是短的元數(shù)據(jù)鎖,特別是 Sch-M 鎖必須等待此表上的所有阻塞事務(wù)完成。
--在等待期間,Sch-M 鎖在訪問同一表時阻止在此鎖后等待的所有其他事務(wù)。 對本地臨時表創(chuàng)建索引時,ONLINE 不能設(shè)置為 ON。
--online=off:在索引操作期間應(yīng)用表鎖。這樣可以防止所有用戶在操作期間訪問基礎(chǔ)表。
--創(chuàng)建、重新生成或刪除聚集索引或者重新生成或刪除非聚集索引的脫機(jī)索引操作將對表獲取架構(gòu)修改 (Sch-M) 鎖。
--這樣可以防止所有用戶在操作期間訪問基礎(chǔ)表。 創(chuàng)建非聚集索引的脫機(jī)索引操作將對表獲取共享 (S) 鎖。 這樣可以防止更新基礎(chǔ)表,但允許讀操作(如 SELECT 語句)。
online=off,
--aloow_row_locks:指定是否允許行鎖。
--allow_row_locks=on:訪問索引時允許行鎖。數(shù)據(jù)庫引擎確定何時使用行鎖。
--allow_row_locks=off:不使用行鎖。
allow_row_locks=on,
--allow_page_locks:指定是否允許使用頁鎖。
--allow_page_locks=on:訪問索引時允許頁鎖。數(shù)據(jù)庫引擎確定何時使用頁鎖。
-- allow_page_locks=off:不使用頁鎖。
allow_page_locks=on ,
--fillfactor=n:指定一個百分比,指示在數(shù)據(jù)庫引擎創(chuàng)建或修改索引的過程中,應(yīng)將每個索引頁面的葉級填充到什么程度。 指定的值必須是 1 到 100 之間的整數(shù)。 默認(rèn)值為 0。
fillfactor=1,
--maxdop=max_degree_of_parallelism:在索引操作期間替代 max degree of parallelism 配置選項(xiàng)。 有關(guān)詳細(xì)信息,請參閱 配置 max degree of parallelism 服務(wù)器配置選項(xiàng)。 使用 MAXDOP 可以限制在執(zhí)行并行計劃的過程中使用的處理器數(shù)量。 最大數(shù)量為 64 個處理器。
--max_degree_of_parallelism 可以是:
--1 - 取消生成并行計劃。
-->1 - 將并行索引操作中使用的最大處理器數(shù)量限制為指定數(shù)量。
--0(默認(rèn)值)- 根據(jù)當(dāng)前系統(tǒng)工作負(fù)荷使用實(shí)際數(shù)量的處理器或更少數(shù)量的處理器。
--有關(guān)詳細(xì)信息,請參閱 配置并行索引操作。
maxdop=1
--data_compression=row:為指定的表、分區(qū)號或分區(qū)范圍指定數(shù)據(jù)壓縮選項(xiàng)。 選項(xiàng)如下所示:
--none
--不壓縮表或指定的分區(qū)。 僅適用于行存儲表;不適用于列存儲表。
--row
--使用行壓縮來壓縮表或指定的分區(qū)。 僅適用于行存儲表;不適用于列存儲表。
--page
--使用頁壓縮來壓縮表或指定的分區(qū)。 僅適用于行存儲表;不適用于列存儲表。
--columnstore
--適用范圍: SQL Server 2014 (12.x) 到 SQL Server 2017。
--僅適用于列存儲表。 COLUMNSTORE 指定對使用 COLUMNSTORE_ARCHIVE 選項(xiàng)壓縮的分區(qū)進(jìn)行解壓縮。 還原數(shù)據(jù)時,將繼續(xù)通過用于所有列存儲表的列存儲壓縮對 COLUMNSTORE 索引進(jìn)行壓縮。
--columnstore_archive
--適用范圍: SQL Server 2014 (12.x) 到 SQL Server 2017。
--僅適用于列存儲表,這是使用聚集列存儲索引存儲的表。 COLUMNSTORE_ARCHIVE 會進(jìn)一步將指定分區(qū)壓縮到更小。 這可用于存檔,或者用于要求更少存儲并且可以付出更多時間來進(jìn)行存儲和檢索的其他情形
--data_compression=none
--on partitions ( { <partition_number_expression> | <range> } [ ,...n ] ) 適用范圍: SQL Server 2008 到 SQL Server 2017。
--指定對其應(yīng)用 DATA_COMPRESSION 設(shè)置的分區(qū)。 如果表未分區(qū),ON PARTITIONS 參數(shù)將生成錯誤。 如果不提供 ON PARTITIONS 子句,DATA_COMPRESSION 選項(xiàng)將應(yīng)用于已分區(qū)表的所有分區(qū)。
--可以按以下方式指定 <partition_number_expression>:
--提供一個分區(qū)號,例如:ON PARTITIONS (2)。
--提供若干單獨(dú)分區(qū)的分區(qū)號并用逗號將它們隔開,例如:ON PARTITIONS (1, 5)。
--同時提供范圍和單個分區(qū),例如:ON PARTITIONS (2, 4, 6 TO 8)。
--<range> 可以指定為以單詞 TO 隔開的分區(qū)號,例如:ON PARTITIONS (6 TO 8)。
--,請多次指定 DATA_COMPRESSION 選項(xiàng)
--on partitions(1-2)
)
on [primary]; --數(shù)據(jù)空間規(guī)范
go
--添加注釋
execute sp_addextendedproperty N'MS_Description',N'第一個非聚集索引',N'schema',N'dbo',N'table',N'test1',N'index',N'nonclus1';
go
創(chuàng)建非聚集索引優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1、可以對表或索引視圖創(chuàng)建多個非聚集索引, 對于每個表可創(chuàng)建的最大非聚集索引數(shù)為999。
2、非聚集索引通常可幫助您通過比搜索基礎(chǔ)表更快的速度查找數(shù)據(jù);有時可以完全由非聚集索引中的數(shù)據(jù)回答查詢,或非聚集索引可將數(shù)據(jù)庫引擎指向基礎(chǔ)表中的行。
3、創(chuàng)建非聚集索引是為了提高聚集索引不涵蓋的頻繁使用的查詢的性能,或在沒有聚集索引的表(稱為堆)中查找行。
4、非聚集索引比聚集索引層次多,添加記錄不會引起數(shù)據(jù)順序的重組。
5、基礎(chǔ)表的數(shù)據(jù)行不按非聚集鍵的順序排序和存儲。
缺點(diǎn):
1、查詢速度沒有聚集索引查詢速度快。
2、索引需要占物理空間。
總結(jié)
以上是生活随笔為你收集整理的SQLServer之创建非聚集索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx+Redis+Ehcache:
- 下一篇: 数据库连接工具HeidiSql介绍(支持