2011-12-05 22 views
0

我有以下查詢需要大約50秒的100個記錄,但使用計數我已經確定結果集將是100000個項目 (這是一個報告),所以我正在尋找方法以提高性能。在大型數據集上進行交叉連接的Xml查詢。如何提高性能

SELECT TOP 200 
OL.*, 
LI.LineItem.value('Field[@name="storename"][1]/@value', 'varchar(MAX)') AS storename, 
LI.LineItem.value('Field[@name="pwnumber"][1]/@value', 'varchar(MAX)') AS pwnumber, 
LI.LineItem.value('Field[@name="department"][1]/@value', 'varchar(MAX)') AS department, 
LI.LineItem.value('Field[@name="item"][1]/@value', 'varchar(MAX)') AS item, 
LI.LineItem.value('Field[@name="barcode"][1]/@value', 'varchar(MAX)')AS barcode, 
LI.LineItem.value('Field[@name="oldprice"][1]/@value', 'varchar(MAX)')AS oldprice, 
LI.LineItem.value('Field[@name="newprice"][1]/@value', 'varchar(MAX)')AS newprice, 
LI.LineItem.value('Field[@name="goodsgroup"][1]/@value', 'varchar(MAX)')AS goodsgroup, 
LI.LineItem.value('Field[@name="startdate"][1]/@value', 'varchar(MAX)')AS startdate, 
LI.LineItem.value('Field[@name="prodgroup"][1]/@value', 'varchar(MAX)')AS prodgroup, 
LI.LineItem.value('Field[@name="season"][1]/@value', 'varchar(MAX)')AS season, 
LI.LineItem.value('Field[@name="pkquantity"][1]/@value', 'varchar(MAX)')AS pkquantity, 
LI.LineItem.value('Field[@name="recordtype"][1]/@value', 'varchar(MAX)')AS recordtype 
FROM [lines] OL 
LEFT JOIN [Clineextension] OLE ON OL.OrderLineId = OLE.OrderLineId 
CROSS APPLY OLE.LineItems.nodes('/LineItems/LineItem') as LI(LineItem) 
WHERE Customer = 1302 
AND StatusId > 1 

我認爲,尤其是select語句可以提高,但我不知道如何。

有什麼想法? 任何幫助,非常感謝。

其他信息 SQL Server 2005中 所有權利 XML字段根據客戶變化對XML列

+0

XML列是否在其上有[XML索引](http://msdn.microsoft.com/zh-cn/library/bb934097(v = SQL.100).aspx)?如果他們不看看MSDN文章[SQL Server 2005中的XML索引](http://msdn.microsoft.com/zh-cn/library/ms345121(v = SQL.90).aspx) –

回答

0

使用索引和性能將大幅增加。

+0

this確實是一個巨大的性能提升(在qa系統上),但是我們決定簡單地使用一個應用來加載完整的xml,然後在應用程序中創建一個報告,因爲這在我們現有的框架中很容易實現,並且花費的時間少於在超過數百萬記錄表上構建一個xml索引,並且每個記錄表具有很多xml – Patrick