2016-02-12 38 views
0

我是SQL新手,並且遇到非常慢的視圖,應該爲特定的人員返回最新的事件。這個視圖並不使用PERSON實體(但它可以)。關係Person-> Event是oneToMany。SQL - 查看速度很慢或不返回任何結果

結構

PERSON: 
ID 
NAME 

EVENT: 
PERSON_ID 
EVENT_DESC 
EVENT_TYPE 
IDX 

下面是很慢的觀點,其工作速度太慢(上PERSON_ID和ID索引創建的,但它仍然是非常慢)

select * from V_CURRENT_EVENT_FOR_PERSON where person_id = 123456

查看(太慢)

create or replace force view "V_CURRENT_EVENT_FOR_PERSON" ("PERSON_ID", 
    "EVENT_DESC", "EVENT_TYPE") as 
select * from (SELECT EVENT.PERSON_ID   AS PERSON_ID, 

    EVENT.EVENT_DESC AS EVENT_DESC, 
    EVENT.EVENT_TYPE  AS EVENT_TYPE 

    FROM PERSON_EVENT_DATA EVENT 
    WHERE EVENT.ID = 
    (SELECT EVENT2.ID 
    FROM PERSON_EVENT_DATA EVENT2 
    WHERE EVENT2.PERSON_ID = EVENT.PERSON_ID 
    GROUP BY EVENT2.PERSON_ID, 
     EVENT2.IDX, 
     EVENT2.ID 
    HAVING EVENT2.IDX = 
     (SELECT MAX(EVENT3.IDX) 
     FROM PERSON_EVENT_DATA EVENT3 
     WHERE EVENT3.PERSON_ID = EVENT2.PERSON_ID 
    ) 
    )) 

我試圖將其更改爲:

create or replace force view "V_CURRENT_EVENT_FOR_PERSON" ("PERSON_ID", 
    "EVENT_DESC", "EVENT_TYPE") as 
select * from (SELECT EVENT.PERSON_ID   AS PERSON_ID, 

    EVENT.EVENT_DESC AS EVENT_DESC, 
    EVENT.EVENT_TYPE  AS EVENT_TYPE 

    FROM PERSON_EVENT_DATA EVENT order by EVENT.idx desc 

) where rownum = 1 

但這裏select * from V_CURRENT_EVENT_FOR_PERSON where person_id = 123456從未retures因爲rownum = 1

回答

2

任何結果。如果我理解正確你的問題,下面應該做你想要什麼:

select person_id, event_desc, event_type 
from (
    select person_id, 
     event_desc, 
     event_type, 
     row_number() over (partition by person_id order by idx desc) as rn 
    from person_event_data 
) t 
where rn = 1; 
+0

工作速度提高一倍,謝謝。我將它包裝在VIEW中。它在實踐中如何運作?當我選擇* from V_CURRENT_EVENT_FOR_PERSON where person_id = 123456 ...它會搜索所有人的所有事件,然後爲person_id應用條件,或者它只搜索人員123456的事件? – michealAtmi

+0

@michealAtmi:檢查執行計劃。我會假設Oracle將'where person_id ='的條件推入視圖中,並且不對所有行進行評估。但是隻有執行計劃才能告訴你。 –

+0

新問題發生:當我做分頁(每頁10個元素,關於page2的qyery)查詢如下:select p。* from person p left outer join V_CURRENT_EVENT_FOR_PERSON vv on p.id = vv.person_id where rownum> 10,then nothing返回.. – michealAtmi