1. 程式人生 > >SQL Server: 建立 XML 索引 提升查詢效率

SQL Server: 建立 XML 索引 提升查詢效率

Scenario: 最近在工作中遇到一個問題,客戶訪問公司產品的某報表功能時,速度極慢,在客戶環境甚至達到15+分鐘的頁面載入時間。經分析,問題的原因是多方面的,其中最主要的一項是產品資料庫(SQL Server)的一個核心欄位採用了XML型別儲存,先不討論其設計的優劣,但大量的XML查詢確實大大的影響到了產品體驗。

Solution: 這裡為了以最快的速度解決使用者問題,採用 建立 XML 索引 的方式,並通過結合其他的邏輯優化,整體的查詢效率提升了近十倍,客戶只用了不到兩分鐘便得到了結果,效率的提升還是比較喜人的。以下是XML索引的建立語句,供參考。不過需要注意的是,這是一種以空間換時間的優化方式,在應用前最好讓客戶瞭解並許可。

以下SQL指令碼分別在名為Sites及Webs表中的Properties這個XML欄位建立了主XML索引及輔助XML索引。


[sql]
-- Drop secondary indexes.
DROP INDEX IXML_Sites_Properties_Path ON Sites
GO
DROP INDEX IXML_Sites_Properties_Property ON Sites
GO
DROP INDEX IXML_Sites_Properties_Value ON Sites
GO
-- Drop primary index.
DROP INDEX IPXML_Sites_Properties ON Sites
GO

--XML主索引
CREATE PRIMARY XML INDEX IPXML_Sites_Properties ON Sites(Properties)
GO
--XML路徑輔助索引
CREATE XML INDEX IXML_Sites_Properties_Path ON Sites(Properties)
USING XML INDEX IPXML_Sites_Properties FOR PATH
GO
--XML屬性輔助索引
CREATE XML INDEX IXML_Sites_Properties_Property ON Sites(Properties)
USING XML INDEX IPXML_Sites_Properties FOR PROPERTY
GO
--XML內容輔助索引
CREATE XML INDEX IXML_Sites_Properties_Value ON Sites(Properties)
USING XML INDEX IPXML_Sites_Properties FOR VALUE
GO

-- Drop secondary indexes.
DROP INDEX IXML_Webs_Properties_Path ON Webs
GO
DROP INDEX IXML_Webs_Properties_Property ON Webs
GO
DROP INDEX IXML_Webs_Properties_Value ON Webs
GO
-- Drop primary index.
DROP INDEX IPXML_Webs_Properties ON Webs
GO

CREATE PRIMARY XML INDEX IPXML_Webs_Properties ON Webs(Properties)
GO
CREATE XML INDEX IXML_Webs_Properties_Path ON Webs(Properties)
USING XML INDEX IPXML_Webs_Properties FOR PATH
GO
CREATE XML INDEX IXML_Webs_Properties_Property ON Webs(Properties)
USING XML INDEX IPXML_Webs_Properties FOR PROPERTY
GO
CREATE XML INDEX IXML_Webs_Properties_Value ON Webs(Properties)
USING XML INDEX IPXML_Webs_Properties FOR VALUE
GO
[/sql]