適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
選擇性 XML 索引是除了一般 XML 索引之外,另一種可供您使用 XML 索引類型。 選擇性 XML 索引功能的目標如下:
改善 SQL Server 中所儲存 XML 資料的查詢效能。
支援更快索引大型 XML 資料工作負載。
透過減少 XML 索引的儲存成本提升可調適性。
一般 XML 索引的主要限制在於會索引整份 XML 文件。 這樣會導致幾項重大錯誤,例如,查詢效能降低與索引維護成本增加,這些大部分與索引的儲存成本相關。
選擇性 XML 索引功能可讓您僅從 XML 文件升級要索引的特定路徑。 在建立索引時,這些路徑會經過評估,而這些路徑指向的節點會經過切割,並且儲存到 SQL Server 中的關聯式資料表。 此功能使用 Microsoft Research 與 SQL Server 產品小組共同開發的高效率對應演算法。 此演算法會將 XML 節點對應到單一關聯式資料表並達到絕佳的效能,同時只需要適度的儲存空間。
選擇性 XML 索引功能也支援在已由選擇性 XML 索引進行索引之節點上的次要選擇性 XML 索引。 這些次要選擇性索引不但有效率,還能進一步提升查詢效能。
選擇性 XML 索引的優點
選擇性 XML 索引提供下列優點:
大幅提升對一般查詢負載之 XML 資料類型的查詢效能。
與一般 XML 索引相較之下,儲存需求更低。
與一般 XML 索引相較之下,索引維護成本減少。
不需要更新應用程式就能受益於選擇性 XML 索引的優點。
選擇性 XML 索引和主要 XML 索引
重要
在大部分情況下,建立選擇性 XML 索引會比一般 XML 索引獲得更佳的效能和更有效率的儲存。
但是,下列任一情況為真時,不建議使用選擇性 XML 索引:
對應大量節點路徑。
在文件結構中支援未知元素或未知位置中元素的查詢。
選擇性 XML 索引範例
在大約有 500,000 個資料列的資料表中將下列 XML 片段視為 XML 文件:
<book>
<created>2004-03-01</created>
<authors>Various</authors>
<subjects>
<subject>English wit and humor -- Periodicals</subject>
<subject>AP</subject>
</subjects>
<title>Punch, or the London Charivari, Volume 156, April 2, 1919</title>
<id>etext11617</id>
</book>
在這個簡單的結構描述中那麼多個資料列上建立主要 XML 索引,需要花很長的時間。 查詢此資料也會因主要 XML 索引不支援選擇性索引而受到影響。
如果您只需要在 /book/title 路徑和 /book/subjects 路徑上查詢此資料,可以建立下列選擇性 XML 索引:
CREATE SELECTIVE XML INDEX SXI_index
ON Tbl(xmlcol)
FOR
(
pathTitle = '/book/title/text()' AS XQUERY 'xs:string',
pathAuthors = '/book/authors' AS XQUERY 'node()',
pathId = '/book/id' AS SQL NVARCHAR(100)
);
上述陳述式是 CREATE 語法的很好範例,您可在建立選擇性 XML 索引時使用。 在 CREATE 陳述式中,首先提供索引的名稱,並且識別要索引的資料表和 XML 資料行。 然後提供要索引的路徑。 路徑有三個部分:
可唯一識別路徑的名稱。
描述路徑的 XQuery 運算式。
選用的最佳化提示。
如需有關這些元素的詳細資訊,請參閱 相關工作。
支援的功能、必要條件和限制
支援的 XML 功能
選擇性 XML 索引支援 SQL Server 在 exist()、value() 和 nodes() 方法內支援的 XQuery。
對於
exist()、value()和nodes()方法,選擇性 XML 索引包含足夠的資訊,可用來轉換整個運算式。對於
query()和modify()方法,選擇性 XML 索引只能用於節點篩選。對於
query()方法,不能使用選擇性 XML 索引來擷取結果。對於
modify()方法,不能使用選擇性 XML 索引來更新 XML 文件。
不支援的 XML 功能
選擇性 XML 索引不支援 SQL Server 實作 XML 所支援的下列功能:
索引包含複雜 XS 類型的節點:聯集類型、序列類型和清單類型。
索引包含二進位 XS 類型的節點:例如 base64Binary 和 hexBinary。
使用結尾包含萬用字元
*的 XPath 運算式來指定索引的節點:例如,/a/b/c/*、/a//b/*或/a/b/*:c。索引子系、屬性或下階以外的任何座標軸。
//<step>案例可做為特殊案例。索引 XML 處理指示和註解。
使用 id() 函數指定及擷取節點識別碼。
必要條件
下列必要條件必須存在,您才能在使用者資料表中的 XML 資料行上建立選擇性 XML 索引:
叢集索引必須存在於使用者資料表的主索引鍵上。
搭配選擇性 XML 索引使用時,使用者資料表的主索引鍵大小限制為 128 個位元組。
搭配選擇性 XML 索引使用時,使用者資料表的叢集索引鍵限制為 15 個資料行。
限制
一般需求和限制
- 每一個選擇性 XML 索引只能在單一 XML 資料行上建立
- 您無法在非 XML 資料行上建立選擇性 XML 索引
- 資料表中的每個 XML 資料行只能有一個選擇性 XML 索引
- 每一個資料表最多可以有 249 個選擇性 XML 索引。
所支援物件的限制
您無法在下列物件上建立選擇性 XML 索引:
- 檢視中的 XML 資料行
- XML 資料行的資料表值變數
- XML 類型變數
- 計算 XML 資料行
- 深度超過 128 個巢狀節點的 XML 資料行。
儲存體限制
對於 XML 文件中可加入至索引的節點數目,會有某一限度的限制。 選擇性 XML 索引會將 XML 文件對應到單一關聯式資料表。 因此,它不能在資料表的任一資料列中擁有超過 1024 個非 null 資料行。 此外,疏鬆資料行的許多限制也會套用至選擇性 XML 索引,因為索引會使用疏鬆資料行進行儲存。
任一資料列中支援的非 null 資料行數目上限取決於資料行中資料的大小:
在最好的情況下,如果所有資料行都是 bit類型,則可支援 1024 個非 null 資料行。
在最差的情況下,如果所有資料行都是 varchar類型的大型物件,則只能支援 236 個非 null 資料行。
選擇性 XML 索引會在內部針對每一個索引的節點路徑使用一到四個資料行。 依據索引路徑中實際的資料大小而定,可進行索引的節點總數範圍可從 60 個到數百個節點。
在最差的情況下,如果節點路徑定義中的部分或全部節點是使用
//對應,則索引節點的最大數目為 60。在最好的情況下,如果節點路徑定義中的節點都不是使用
//對應,則索引節點的最大數目為 200。
選擇性 XML 索引會在您 CREATE 或 ALTER 索引時重建
當您 CREATE 或 ALTER 選擇性 XML 索引時,它會在單一執行緒的離線模式中重建。 太多 ALTER 陳述式會對索引之 XML 文件上的查詢效能產生負面影響。
其他限制
查詢提示不支援選擇性 XML 索引。
Database Tuning Advisor 不支援選擇性 XML 索引和次要選擇性 XML 索引。