2016-02-12 73 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