SQLServer之建立主XML索引

建立主XML索引注意事項

若要建立主 XML 索引,請使用 CREATE INDEX (Transact-SQL) Transact-SQL DDL 語句。 XML 索引不徹底支持可用於非 XML 索引的全部選項。數據庫

建立 XML 索引時注意下列事項:服務器

若要建立主 XML 索引,含有被索引的 XML 列的表(稱爲基表)必須具備主鍵的彙集索引。 這確保了在對基表進行了分區的狀況下,可使用相同的分區方案和分區函數對主 XML 索引進行分區。架構

若是存在 XML 索引,則不能修改基表的彙集主鍵。 在修改主鍵以前,必須刪除表的全部 XML 索引。函數

您能夠對單個 xml 類型列建立主 XML 索引。 您沒法將 XML 類型列做爲鍵列來建立任何其餘類型的索引。 可是,能夠在非 XML 索引中包含 xml L 類型列。 表中的每一個 xml 類型列均可以有本身的主 XML 索引。 可是,一個 xml 類型列只容許有一個主 XML 索引。工具

XML 索引和非 XML 索引存在於相同的命名空間中。 所以,同一表的 XML 索引和非 XML 索引不能具備相同的名稱。spa

對於 XML 索引,IGNORE_DUP_KEY 選項和 ONLINE 選項始終設置爲 OFF。 您能夠將這些選項的值指定爲 OFF。設計

將用戶表的文件組和分區信息應用於 XML 索引。 用戶沒法單獨爲 XML 索引指定這些信息。3d

DROP_EXISTING 索引選項能夠刪除主 XML 索引並建立一個新的主 XML 索引,或者刪除輔助 XML 索引並建立一個新的輔助 XML 索引。 可是,此選項不能經過刪除輔助 XML 索引來建立新的主 XML 索引,反之亦然。xml

主 XML 索引名稱與視圖名稱有相同的限制。對象

不能對視圖中的 xml 類型列、 xml 類型列的 表值變量或 xml 類型變量建立 XML 索引。

若要使用 ALTER TABLE ALTER COLUMN 選項將 xml 類型列從非類型化的 XML 更改成類型化的 XML,或者從類型化的 XML 更改成非類型化的 XML,則列不該存在 XML 索引。 若是確實存在,則在嘗試更改列類型以前必須刪除該索引。

建立 XML 索引時必須將選項 ARITHABORT 設置爲 ON。 若要使用 XML 數據類型方法查詢、刪除、更新 XML 列中的值或向 XML 列中插入值,則必須對鏈接設置相同的選項。 若是沒有設置,則 XML 數據類型方法將會失敗。

備註

有關 XML 索引的信息能夠在目錄視圖中找到。 可是,不支持 sp_helpindex 。 本主題後面部分提供的示例說明了如何查詢目錄視圖以查找 XML 索引信息。

若是 XML 數據類型列包含類型爲 XML 架構類型 xs:date 或 xs:dateTime (或這些類型的任何子類型)的值且這些值中的年份小於 1,則在對這樣的 XML 數據類型列建立或從新建立主 XML 索引時,索引建立操做在 SQL Server 2008 和更高版本中將失敗。 SQL Server 2005 容許使用這些值,所以在 SQL Server 2005中生成的數據庫中建立索引時可能會出現這種問題。 有關詳細信息,請參閱 類型化的 XML 與非類型化的 XML 的比較。

使用SSMS數據庫管理工具建立主XML索引

使用表設計器建立主XML索引

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

clipboard.png

二、在表設計器窗口-》選擇要建立xml索引的數據列-》右鍵點擊-》選的xml索引。

clipboard.png

三、在xml索引彈出框-》點擊添加,添加索引-》輸入索引名稱-》輸入索引描述-》表設計器能夠選擇默認-》點擊關閉。

clipboard.png

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

clipboard.png

使用對象資源管理器建立主XML索引

一、鏈接數據庫,選擇數據庫,選擇數據表-》展開數據表-》右鍵點擊索引-》選擇新建索引-》選擇主XML索引。

clipboard.png

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

clipboard.png

三、在數據列彈出框-》選擇數據列-》點擊肯定。

clipboard.png

四、在新建索引彈出框-》點擊選項-》主XML索引屬性能夠本身設置,也能夠選擇系統默認。

clipboard.png

五、在新建索引彈出框-》選擇擴展屬性-》輸入擴展屬性名稱和值-》輸入完成點擊肯定。

clipboard.png

六、不須要刷新表可直接查看結果。

clipboard.png

使用T-SQL腳本建立主XML索引

語法:

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

--判斷xml索引是否存在,若是存在則先刪除在建立
if exists(select * from sys.indexes where name=索引名稱)
drop index 索引名稱 on 表名;
go

--添加xml數據類型數據列
create
primary --聲明爲主索引
xml --聲明爲xml索引
index --聲明建立索引
索引名稱--聲明索引名稱
on 表名--聲明索引所在表
(列名) --聲明索引在哪一個數據列
with(
--pad_index:指定索引填充
--pad_index=on:FILLFACTOR 指定的可用空間百分比應用於索引的中間級頁。
--pad_index=off或未指定 fillfactor:考慮到中間級頁上的鍵集,能夠將中間級頁幾乎填滿,但至少要爲最大索引行留出足夠空間。
pad_index={ on | off },

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

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

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

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

--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
)
go

--添加索引註釋
execute sp_addextendedproperty N'MS_Description',N'縮影描述',N'user',N'dbo',N'table',N'test1',N'index',N'說明名稱';
go

示例:

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

--判斷xml索引是否存在,若是存在則先刪除在建立
if exists(select * from sys.indexes where name='xmlindex')
drop index xmlindex on test1;
go

--添加xml數據類型數據列
create
primary --聲明爲主索引
xml --聲明爲xml索引
index --聲明建立索引
xmlindex --聲明索引名稱
on test1 --聲明索引所在表
(xml1) --聲明索引在哪一個數據列
with(
--pad_index:指定索引填充
--pad_index=on:FILLFACTOR 指定的可用空間百分比應用於索引的中間級頁。
--pad_index=off或未指定 fillfactor:考慮到中間級頁上的鍵集,能夠將中間級頁幾乎填滿,但至少要爲最大索引行留出足夠空間。
pad_index=on,

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

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

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

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

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

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

--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,

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

--添加索引註釋
execute sp_addextendedproperty N'MS_Description',N'第一個xml數據列',N'user',N'dbo',N'table',N'test1',N'index',N'xmlindex';
go

clipboard.png

建立主XML索引優缺點

優勢:

一、能夠完整、一致的表示XML的值。

二、XML 值相對較大,而檢索的部分相對較小。 生成索引避免了在運行時分析全部數據,並能實現高效的查詢處理,從而使索引查找受益。

三、查詢效率會大大提升。

缺點:

一、增長存儲空間。

相關文章
相關標籤/搜索