2013-01-08 104 views
0

我是XQuery的新手。 请建议一种方法来优化以下查询。如何优化这个查询?

我已经尝试下面的查询它是花费比预期更多的时间。

Select 
A.a_name, 
I.p_type, 
SUM(P.c_n_amount) AS c_n_amount, 
CASE WHEN SUM(ABS(M_value)) = 0 THEN 0 
ELSE SUM(ABS(Price) * ABS(M_value))/SUM(ABS(M_value)) END AS 
[price], 
SUM(M_value) AS m_value,SUM(N50) [-50],SUM(P50) [50] 
from position P 
INNER JOIN COUNT AS A ON P.a_id = A.a_id 
INNER JOIN I_VIEW AS I ON P.i_id = I.i_id 
inner join (
select R_C.p_id,M_value,Price,N50,P50 
from(
select j.p_id, 
C.value('(Result[@resultName = "m_value"]/resultValue)[1]', 'float') as M_value, 
C.value('(Result[@resultName = "price"]/resultValue)[1]', 'float') as Price 
from jyothi_xml j CROSS APPLY resultkeys.nodes('/Results') T(C) 
where r_set='POLY' and r_category ='sk') R_Category, 
(select j1.p_id, 
C.value('(Result[@resultName = "rate_shock_n50"]/resultValue)[1]', 'float') as N50, 
C.value('(Result[@resultName = "rate_shock_p50"]/resultValue)[1]', 'float') as P50 
from jyothi_xml j1 CROSS APPLY resultkeys.nodes('/Results') T(C) 
where result_set='POLY' and result_category ='rate_shocks') R_S_Category,position p 
where p.p_id=R_Category.p_id and p.p_id=R_S_Category.p_id) XMlData on p.p_id=XMlData.p_id 
WHERE P.as_of_date = '2012-10-10' 
GROUP BY A.a_name, I.p_type 
+0

您操作的数据是什么?你期望的结果是什么?一般来说,在XQuery中,尽可能早地使用谓词是有利的,也就是说,不用(Result [@resultName =“m_value”]/resultValue)[1] use(Result [@resultName =“m_value”] [1]/resultValue)。但是,我猜XQuery并不是这里的瓶颈。相反,你有一个相当昂贵的SQL与联合,聚合和subquerys。相比之下,你的XQuery似乎是简单的数据提取。请首先检查一下,XQuery确实是这里的问题。 – dirkk

回答

0

如果您有大量的XML需要解析,首先要限制哪些行需要XML,然后通过它们进行解析是非常有益的。因此,如果可以的话,从Position,Count和I_View表中找出需要的,然后在jyothi_xml表中搜索这些ID。我发现这对我的查询有很大帮助。