2012-11-21 200 views
0

以下是查詢。 closed_ts是一個時間戳列。我想要做的是,查明今年,本月,今年和本週有多少人「關閉」。有一個更好的方法嗎?Oracle查詢優化幫助(涉及TRUNC)

select table_id, 
    case 
    when trunc(closed_ts) = trunc(SYSDATE, 'DD') then 1 
    else 0 
    end as day_count, 
    case 
    when trunc(closed_ts) >= trunc(SYSDATE, 'MM') then 1 
    else 0 
    end as month_count, 
case 
    when trunc(closed_ts) >= trunc(sysdate, 'YYYY') then 1 
    else 0 
end as year_count, 
case 
    when trunc(closed_ts) >= TRUNC(sysdate, 'IW') then 1 
    else 0 
end as week_count 
from myTable 

回答

0

好像你想與周圍的每個case語句和GROUP BY的table_id的總和()來彙總值,但既然你問有關查詢優化...

如果有一個指數closed_ts你將無法使用它,因爲你正在截取它。截斷closed_ts日期是不必要的,因爲您正在檢查它是否嚴格大於日,周,月,年,因此此查詢肯定會導致全表掃描。

我可能重寫它沒有TRUNC是否有上closed_ts與否的指標:

select table_id 
     ,sum(case when closed_ts >= trunc(sysdate) then 1 else 0 end) as day_count 
     ,sum(case when closed_ts >= trunc(sysdate,'MM') then 1 else 0 end) as month_count 
     ,sum(case when closed_ts >= trunc(sysdate,'YYYY') then 1 else 0 end) as year_count 
     ,sum(case when closed_ts >= trunc(sysdate,'IW') then 1 else 0 end) as week_count 
from myTable 
group by table_id 

BTW:table_id的聽起來像一個主或代理鍵 - 你確定你想要的結果?

+1

沒有where子句,是否存在closed_ts上的索引是無關的 – Jeff

+0

我正在求和和分組。我只是沒有將它包含在我原來的查詢中以求簡潔。我們確實在closed_ts上有索引。我會嘗試> =沒有trunc(closed_ts)。感謝您及時的回覆。 –

0

流行的(closed_ts,table_id的)索引,並在如下closed_ts應用謂詞...

select 
    table_id, 
    sum(case when closed_ts >= trunc(SYSDATE,'DD' ) then 1 end) day_count, 
    sum(case when closed_ts >= trunc(SYSDATE,'MM' ) then 1 end) month_count, 
    sum(case when closed_ts >= trunc(SYSDATE,'YYYY') then 1 end) year_count, 
    sum(case when closed_ts >= trunc(SYSDATE,'IW' ) then 1 end) week_count, 
from 
    myTable 
where 
    closed_ts >= least(trunc(SYSDATE,'YYYY'),trunc(SYSDATE,'IW')) 
group by 
    table_id 

正如user1842757提到的,失去的closed_ts將trunc。您也可以在案件陳述中丟失ELSE 0