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
工作速度提高一倍,谢谢。我将它包装在VIEW中。它在实践中如何运作?当我选择* from V_CURRENT_EVENT_FOR_PERSON where person_id = 123456 ...它会搜索所有人的所有事件,然后为person_id应用条件,或者它只搜索人员123456的事件? – michealAtmi
@michealAtmi:检查执行计划。我会假设Oracle将'where person_id ='的条件推入视图中,并且不对所有行进行评估。但是只有执行计划才能告诉你。 –
新问题发生:当我做分页(每页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