簡體   English   中英

SQL Server 2008 XML列性能問題

[英]SQL Server 2008 XML column performance Issue

我們有一個帶有XML列的表,其中包含很多數據,這在我們的開發環境中運行良好,但是隨着表的大小增加(接近10,000行),我們開始發現性能問題。

僅執行SELECT *僅需12秒鍾...

有什么建議可以解決這個問題嗎?

提前致謝。

您可以檢查幾件事-至少在處理和從XML列中選擇數據時,性能下降是否最主要:

  • 您可以在XML列上放置索引 -如果您需要從XML列中獲取大量數據,則可以提供幫助。 請注意:XML索引會占用大量磁盤空間-在我們的例子中,1.5GB的數據庫的磁盤大小猛增至11GB ....請謹慎使用!

  • 您可以將XML內的某些元素作為計算的,持久化的列“浮出水面”到“父”表上,從而更快地找到所需的行(需要存儲函數-但是,如果您有此需求,這確實是一種很好的技術)

另外:無論如何都不要執行SELECT * -如果不需要XML列-不要選擇它-這將很冗長,並且會占用大量內存。

如果查詢記錄並過濾XML數據類型內的數據,則要求SQL Server檢查所有XML內容以查找結果。

為了加快速度,請將XML數據類型過濾器與全文搜索表達式結合使用。 在解析和搜索XML之前,全文搜索會縮小結果范圍(取決於您的具體程度)。 它可以節省大量CPU和IO。 這是一個例子:

SELECT * 
FROM   Table 
WHERE  CONTAINS(XmlColumn,'value') 
AND    XmlColumn.exist('/element/element/text()[contains(.,"value")]') = 1

這是由Microsoft 在此處記錄的 ,您可以通過運行帶有統計信息的查詢來檢查之前和之后。 這是您打開統計信息的方式:

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

只是要補充一下marc_s所說的話:我還建議使用索引-10k記錄不是很多。 但是請確保在正確的地方添加索引-通常,放置索引的最佳位置是在用於JOIN條件,WHERE子句或ORDER BY子句的列上。 如果在這些情況下您的查詢未使用XML本身,則可以通過在其他列上創建索引來更好地服務(例如,如果您正在非XML列中的ID上進行查找,則可能會看到通過在ID上創建索引獲得更多收益)。

如果實際上提取XML數據的速度很慢,則可以考慮創建覆蓋索引(使用INCLUDE關鍵字),在該索引上您具有ID上的索引,但是包含一個從XML列中提取值的表達式。 這對我的一個項目產生了巨大的影響,但請務必確保測試性能。

當然,如果您的查詢實際上是對XML數據執行JOIN / WHERE / ORDER BY,那么您可能應該執行marc_s建議的操作並在XML列上創建索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM