请求高手优化sql查询速度!!!!! 不分组查询很快,分组后超慢,求解决方法
selectt.fund_acct_id,t.fund_id,t.capital_id,t.org_id,max(t.cur_date)asdtfrom(select/*...
select t.fund_acct_id,
t.fund_id,
t.capital_id,
t.org_id,
max(t.cur_date) as dt
from (select /*+ USE_CONCAT */
t3.fund_acct_id,
t3.fund_id,
t3.cur_date,
t3.capital_id,
t3.org_id,
t3.fund_balance,
t3.freeze_balance,
t3.UnFootIncome,
t3.ADDUPINCOME
from fund_balance t3,
(select vc_fundaccount,
trim(c_fundcode) c_fundcode,
VC_AGENTNO,
to_char(t.D_LASTMODDATE,
'yyyymmdd') cur_date,
VC_TRADENO
from dc_staticshares t
where t.D_LASTMODDATE >
to_date('2010-04-20',
'yyyy-mm-dd')
and nvl(t.f_currentshares, 0) +
nvl(t.f_frozenshares, 0) > 0) t4
Where t3.cur_date <= '20100420'
and t3.fund_acct_id = t4.vc_fundaccount
and t3.fund_id = t4.c_fundcode
and t3.capital_id = t4.vc_tradeno
and t3.org_id = t4.VC_AGENTNO) t
group by t.fund_acct_id,
t.fund_id,
t.capital_id,
t.org_id 展开
t.fund_id,
t.capital_id,
t.org_id,
max(t.cur_date) as dt
from (select /*+ USE_CONCAT */
t3.fund_acct_id,
t3.fund_id,
t3.cur_date,
t3.capital_id,
t3.org_id,
t3.fund_balance,
t3.freeze_balance,
t3.UnFootIncome,
t3.ADDUPINCOME
from fund_balance t3,
(select vc_fundaccount,
trim(c_fundcode) c_fundcode,
VC_AGENTNO,
to_char(t.D_LASTMODDATE,
'yyyymmdd') cur_date,
VC_TRADENO
from dc_staticshares t
where t.D_LASTMODDATE >
to_date('2010-04-20',
'yyyy-mm-dd')
and nvl(t.f_currentshares, 0) +
nvl(t.f_frozenshares, 0) > 0) t4
Where t3.cur_date <= '20100420'
and t3.fund_acct_id = t4.vc_fundaccount
and t3.fund_id = t4.c_fundcode
and t3.capital_id = t4.vc_tradeno
and t3.org_id = t4.VC_AGENTNO) t
group by t.fund_acct_id,
t.fund_id,
t.capital_id,
t.org_id 展开
3个回答
展开全部
如果是海量数据,那速度是很可怕,知道大概有几年的数据吗?你是不是可以尝试只查询一个月的数据,然后将结果放在临时表里,再循环这个查询时间,比如我把2010年1月、2月、3月、4月份的结果用循环查找出来,放到临时表tbl1,然后再从临时表中进行分组,这样效率可能会高一点。
你可能需要尝试一下时间长度为多少时,效率最高,是一个星期一个星期的查,一个月一个月的查,还是三个月,半年,一年。。。。。。。
另外,不知道表dc_staticshares 的数据重复的多吗?多的话应先考虑将重复数据过滤掉,不然也是影响速度的。
你可能需要尝试一下时间长度为多少时,效率最高,是一个星期一个星期的查,一个月一个月的查,还是三个月,半年,一年。。。。。。。
另外,不知道表dc_staticshares 的数据重复的多吗?多的话应先考虑将重复数据过滤掉,不然也是影响速度的。
更多追问追答
追问
dc_staticshares这个表是一个存放最新持仓情况的表,重复的不是很多,那种情况是该用户买了多支基金的情况。并且,我所查询的时间段是——是用户选择需要的日期,到这个日期为止的一个数据情况
追答
那么可以根据用户选的时间段来拆分查询,如果时间跨度很长的话。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.VC_FUNDACCOUNT 和 FUND_BALANCE 为什么不能直接连接查询?
2.你求max() 是需要按 你group by的条件来进行分组吗?还是只是要查询除最大的那个时间就行?
3.是oralce数据库吗?如果是的话,最外层的group by 可以改写成oralce的分析函数。
row_number() over(order by CUR_DATE desc) row_num
然后在外面嵌套一层查询,查询row_num = 1的。
2.你求max() 是需要按 你group by的条件来进行分组吗?还是只是要查询除最大的那个时间就行?
3.是oralce数据库吗?如果是的话,最外层的group by 可以改写成oralce的分析函数。
row_number() over(order by CUR_DATE desc) row_num
然后在外面嵌套一层查询,查询row_num = 1的。
追问
大侠,您可能看错了,主要是dc_staticshares与fund_balance相关的查询。我主要是按group by 的条件进行分组并查到它的最大的时间对应的数据。您能直接帮我修改一下吗?我不太会。很急的。万分感谢
追答
1.是拷错表名了,是DC_STATICSHARES和FUND_BALANCE,这两个表应该可以连接查询吧。
你T4的结果集只是从 DC_STATICSHARES查询数据,完了才跟 FUND_BALANCE 进行关联的吧?
2.还是没明白,你到底是想分组查询,还是只是找到最大的时间的那行数据?
如果你是想分组,这个是没有办法把group by 去掉的。
3.既然是大表,为什么不建索引呢?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
执行计划是啥呀
COST还是Rule?
COST还是Rule?
更多追问追答
追问
可不可以不涉及到修改它的执行计划,而从语句及索引等处入手,因为主机的配置不能随便更改,谢谢!!!!
追答
基于cost那就需要你每个表的统计信息,还有这个SQL的执行计划
表结构啥的也要给我看看,哪些有索引那些没索引我也不知道也
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询