select TB.TaskID,
TB.TaskName,
case TB.InfoID
when 1 then
'aa'
when 2 then
'bb'
when 3 then
'cc'
end as InfoID,
TB.DateBegin,
TB.DateEnd,
Case TB.TaskStatus
when 0 then
'00'
when 1 then
'11'
when 3 then
'33'
End as TaskStatus,
TB.TaskPlanAmount,
(select count(*) from Taskdetailinfo where TaskId = TB.TaskID) as TaskTotalAmount
from TaskBaseInfo TB
where 1 = 1 and TB.TaskStatus <> 2 and
to_date(DATEBEGIN, 'YYYY.MM.DD') <= trunc(sysdate) and
to_date(DATEEND, 'YYYY.MM.DD') >= trunc(sysdate) and taskstatus = 0
order by TB.DATEBEGIN desc, TB.TaskID asc快的0.6s,慢的91s。
这个差别未免太大了。
而且,开始执行时很慢,多执行几次后,一下子就快了。
请教众位。
TB.TaskName,
case TB.InfoID
when 1 then
'aa'
when 2 then
'bb'
when 3 then
'cc'
end as InfoID,
TB.DateBegin,
TB.DateEnd,
Case TB.TaskStatus
when 0 then
'00'
when 1 then
'11'
when 3 then
'33'
End as TaskStatus,
TB.TaskPlanAmount,
(select count(*) from Taskdetailinfo where TaskId = TB.TaskID) as TaskTotalAmount
from TaskBaseInfo TB
where 1 = 1 and TB.TaskStatus <> 2 and
to_date(DATEBEGIN, 'YYYY.MM.DD') <= trunc(sysdate) and
to_date(DATEEND, 'YYYY.MM.DD') >= trunc(sysdate) and taskstatus = 0
order by TB.DATEBEGIN desc, TB.TaskID asc快的0.6s,慢的91s。
这个差别未免太大了。
而且,开始执行时很慢,多执行几次后,一下子就快了。
请教众位。
select TB.TaskID,
TB.TaskName,
decode( TB.InfoID ,
1,'aa',
2,'bb',
'cc') InfoID,
TB.DateBegin,
TB.DateEnd,
decode(TB.TaskStatus,
0,'00',
1 ,'11' ,
'33'
) TaskStatus,
TB.TaskPlanAmount,
count(*) TaskTotalAmount
from TaskBaseInfo TB
where 1 = 1 and TB.TaskStatus <> 2 and
to_date(DATEBEGIN, 'YYYY.MM.DD') <= trunc(sysdate) and
to_date(DATEEND, 'YYYY.MM.DD') > = trunc(sysdate) and tasksgroup by TB.TaskID, TB.TaskName,TB.InfoID,TB.DateBegin, TB.DateEnd,TB.TaskStatus, TB.TaskPlanAmountorder by TB.DATEBEGIN desc, TB.TaskID asc 用这个语句看看速度如何
建这几个字段的索引,会快一些
TB.TaskID, TB.TaskName,TB.InfoID,TB.DateBegin, TB.DateEnd,TB.TaskStatus, TB.TaskPlanAmount
感谢你帮我修改sql。
但是你把“select count(*) from Taskdetailinfo where TaskId = TB.TaskID”省略了啊。
其实,关键就是慢在这个标量子查询里(Taskdetailinfo表)。to yanleigis:
TB.TaskID作为主键是索引。其他索引还没有创建。索引太多了可能也会影响速度的。
因为是同一sql啊。
有可能是共享池的缘故。我再把情况描述一下:
开始几次执行sql,速度都是一分多钟。
(期间,把标量子查询去掉,速度会很快。把标量子查询加上去,速度变回原来很慢。此证明速度慢,主要还是因为标量子查询的原因。)当多执行几次后,速度突然提高了,竟然不要一秒钟。以后就一直这么快。
第二天再执行的时候,又很慢,然后多执行几次,又....对二位的回复十分感谢。
希望有更多的朋友参与讨论。
select count(*) from Taskdetailinfo where TaskId = TB.TaskID
TB.TaskName,
case TB.InfoID
when 1 then
'aa'
when 2 then
'bb'
when 3 then
'cc'
end as InfoID,
TB.DateBegin,
TB.DateEnd,
Case TB.TaskStatus
when 0 then
'00'
when 1 then
'11'
when 3 then
'33'
End as TaskStatus,
TB.TaskPlanAmount,
count(*) as TaskTotalAmount
from TaskBaseInfo TB ,Taskdetailinfo TC
where TC.TaskId = TB.TaskID and 1 = 1 and TB.TaskStatus <> 2 and
to_date(DATEBEGIN, 'YYYY.MM.DD') <= trunc(sysdate) and
to_date(DATEEND, 'YYYY.MM.DD') > = trunc(sysdate) and taskstatus = 0
group by TB.TaskID, TB.TaskName,DateBegin,DateEnd,TaskStatus,TaskPlanAmount
order by TB.DATEBEGIN desc, TB.TaskID asc 试试这个吧,我想内连接会比子循环要快
select count(*) from Taskdetailinfo where TaskId = TB.TaskID,
直接放到SQL里面,如果表“TaskBaseInfo”里面只有一条记录,就执行一次,
如果这个表里面有一万条记录,上面的查询就要执行一万次。
可以试一下。
3q
经测试,内连接与标量子查询速度相当。还有count为0时就查不出来了。用左连接也未果。
我想问题的关键,主要是找出速度差别大的原因。因为这个差别太大了。to VASDZASD:
这是一个一对多的关系。
Taskdetailinfo 的针对于taskid的count(*)会有几十万条。慢就慢在这里。
您说我写的代码有问题,那应该怎么写呢??
和不加時的效率,相應做修改,如果找出來的數據重復性很大的話超過總數據的30%那就不要使索引,如果還慢那看看他的執行計划,最強制加上規則...我覺得加上rule規則就可以,,group by 是做合并動作但他還附帶一次排序,而索引本身是帶升序排序的,你看你自己的需求含量一下....