主要 XML 索引

主要 XML 索引會在 XML 資料行中檢索 XML 執行個體內的所有標記、值和路徑。若要建立主要 XML 索引,XML 資料行發生所在的資料表必須在資料表的主索引鍵上有叢集索引。SQL Server 會使用這個主索引鍵,讓主要 XML 索引中的資料列與包含此 XML 資料行之資料表中的資料列相互關聯。

主要 XML 索引是 xml 資料類型資料行中 XML BLOB 的切割和保存的表示法。對於資料行中的每個 XML 二進位大型物件 (BLOB) 而言,索引可建立幾個資料列。索引中的資料列數目大約等於 XML 二進位大型物件中的節點數目。當查詢擷取完整 XML 執行個體時,SQL Server 會從 XML 資料行提供此執行個體。XML 執行個體中的查詢會使用主要 XML 索引,並使用索引本身來傳回純量值或 XML 子樹。

每個資料列都會儲存下列節點資訊:

  • 類似元素或屬性名稱的標記名稱。

  • 節點值。

  • 如元素節點、屬性節點或文字節點等節點類型。

  • 文件順序資訊,以內部節點識別碼表示。

  • 從每個節點至 XML 樹狀結構根節點的路徑。在查詢中會為路徑運算式搜尋資料行。

  • 基底資料表的主索引鍵。基底資料表的主索引鍵會在主要 XML 索引中重複,以利向後聯結基底資料表,而基底資料表主索引鍵中資料行的最大數目是限定為 15。

此節點資訊是用以評估和建構指定查詢的 XML 結果。為了達到最佳化,標記名稱與節點類型資訊將會編碼成整數值,而 Path 資料行則會使用相同的編碼。另外,當只知道路徑後置詞時,會以相反順序儲存路徑以允許比對路徑。例如:

  • 在 //ContactRecord/PhoneNumber 中只知道最後兩個步驟

或是

  • 在 /Book/*/Title 中,於運算式的中間指定了萬用字元 (*)。

查詢處理器會使用主要 XML 索引來進行包含 xml 資料類型方法的查詢,並從主要索引本身傳回純量值或 XML 子樹(這個索引會儲存重新建構 XML 執行個體的所有必要資訊)。

例如,下列查詢會傳回儲存在 ProductModel 資料表之 CatalogDescriptionxml 類型資料行中的摘要資訊。此查詢只會針對目錄描述也儲存 <Features> 描述的產品型號傳回其 <Summary> 資訊。

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2008/07/adventure-works2008R2/ProductModelDescription' AS "PD")

SELECT CatalogDescription.query('
  /PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/PD:Features') = 1

至於主要 XML 索引,而不是切割基底資料表中每個 XML 二進位大型物件的執行個體,會針對 exist() 方法中所指定的運算式,循序搜尋索引中與每個 XML 二進位大型物件相對應的資料列。如果在索引中的 Path 資料行找到了路徑,就會從主要 XML 索引擷取 <Summary> 元素及其子樹,並將其轉換為 XML 二進位大型物件,當做 query() 方法的結果。

請注意,在擷取完整 XML 執行個體時不會使用主要 XML 索引。例如,下列查詢會從資料表擷取整個 XML 執行個體,該執行個體描述了特定產品型號的製造指示。

USE AdventureWorks2008R2;

SELECT Instructions
FROM Production.ProductModel 
WHERE ProductModelID=7;